我有两个数组$A
和$B
两者都可能为空。
$A = $B = @()
这有效:
$A+$B | Test-Path
这不起作用:
$A,$B | Test-Path
并返回错误:
Test-Path:无法将参数绑定到参数' Path'因为它是一个空数组。
我希望两个表达式都失败,因为+
运算符正在向另一个运算符添加一个空数组,这意味着结果数组仍为空?
查看两种方法的总体类型表明它们是相同的类型。
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
的互动方式不同?
答案 0 :(得分:4)
$A+$B | ...
连接$A
和$B
。管道然后展开(仍为空)数组,因此您得到$null
并且永远不会调用Test-Path
。
$A,$B | ...
在将数据传递给管道之前构造一个包含两个嵌套数组的数组。管道然后展开外部数组并将每个元素(空数组$A
和$B
)提供给Test-Path
,从而导致您观察到的错误。
基本上你在前者中做$A+$B → @()
,在后一种情况下做$A,$B → @(@(), @())
。