$ null /空交互式vs脚本差异

时间:2017-06-20 15:12:18

标签: powershell

为什么以下3行在PowerShell提示符下运行时没有错误,但在脚本(foo.ps1)中运行时返回错误?在这两种情况下,$b -eq $null都会返回$true$b.GetType()会在$null上返回一个错误,但是在交互式会话中$b会有所不同。

$a = 1,2,3
[array]$b = $a | where {$false}
$b | where {$_.GetType()}

以脚本形式运行时,最后一行返回

  

您无法在空值表达式上调用方法。

我在试图阻止阵列展开的命运多,但遇到了这个问题。删除[array]会导致错误消失,我会继续尝试更好地理解展开规则(我希望$b是一个空数组,而不是$null),但是我想在这里理解差异的原因。

2 个答案:

答案 0 :(得分:1)

有一个perfect explanation

  1. 通过输入[array],您可以告诉变量是强类型的。我怀疑.NET代码中的这一行,触发异常,因为它需要一个类型作为变量... http://referencesource.microsoft.com/#mscorlib/system/array.cs,72

答案 1 :(得分:0)

如果您从ISE或交互式运行此操作,则会保存变量。在您的示例中,我不确定您使用Where-Object代替% / ForEach-Object的原因。研究我认为你正在尝试做的事情:

$a = @(1, 2, 3)
[Array]$b
$a | % { $b += $_ }
$b | % { $_.GetType() }