为什么$ A + $ B和$ A,$ B与Test-Path的交互方式不同

时间:2016-06-29 12:06:44

标签: arrays powershell operators pipeline

我有两个数组$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,$BTest-Path的互动方式不同?

1 个答案:

答案 0 :(得分:4)

在将结果数组传递给管道之前,

$A+$B | ...连接$A$B。管道然后展开(仍为空)数组,因此您得到$null并且永远不会调用Test-Path

$A,$B | ...在将数据传递给管道之前构造一个包含两个嵌套数组的数组。管道然后展开外部数组并将每个元素(空数组$A$B)提供给Test-Path,从而导致您观察到的错误。

基本上你在前者中做$A+$B → @(),在后一种情况下做$A,$B → @(@(), @())

相关问题