2016-06-29 1 views
1

У меня есть два массива $A и $B оба могут быть пустым.

$A = $B = @() 

Это работает:

$A+$B | Test-Path 

Это не работает:

$A,$B | Test-Path 

И возвращает ошибку:

Test-Path : Cannot bind argument to parameter 'Path' because it is an empty array.

я ожидал бы оба выражения на провал, так как оператор + добавив один пустой массив в другой, что означает, что результирующий массив все еще пуст?

Рассмотрение общих типов обоих методов показывает, что они одного типа.

PS Y:\> $E = $A+$B 
PS Y:\> $E.getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

PS Y:\> $F = $A,$B 
PS Y:\> $F.getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

Так почему же $A+$B & $A,$B по-разному взаимодействуют с Test-Path?

+1

'$ A + $ B' объединяет два пустых массива, создавая один мелкий пустой массив. '$ A, $ B' создает новый массив, содержащий два пустых массива –

ответ

4

$A+$B | ... конкатенирует $A и $B перед передачей результирующего массива в трубопровод. Затем конвейер разворачивает (все еще пустой) массив, поэтому вы получаете $null, а Test-Path никогда не вызывается.

$A,$B | ... создает массив с двумя вложенными массивами перед передачей его в конвейер. Затем конвейер разворачивает внешний массив и подает каждый элемент (пустые массивы $A и $B) на Test-Path, что вызывает ошибку, которую вы наблюдаете.

В основном вы делаете $A+$B → @() в первом и $A,$B → @(@(), @()) в последнем случае.

 Смежные вопросы

  • Нет связанных вопросов^_^