2017-06-20 33 views
4

为什么以下三行在没有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),但我想了解其中的差异原因。

+1

'$ a'是一个脚本块。这是为了这个目的吗?为什么'where {$ false}'?在这个例子中'$ b'应该为null,因为where块不通过管道。 – Matt

+0

[相关](https://stackoverflow.com/questions/20022976/difference-between-powershell-console-and-powershell-ise) – Matt

+0

并不意味着让$ a成为一个scriptblock,对不起。它本意是一个数组。我已经更新了它。幸运的是,它不会影响结果和潜在的问题。 – aggieNick02

回答

0

如果您是从ISE或交互式运行它,变量正在保存。在您的示例中,我不确定您为什么使用Where-Object而不是%/ForEach-Object。工作你试图做我认为:

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

在现实生活中,我试图列出一些东西,将其过滤掉,然后将其传递给操作。有时过滤会产生一个空的结果(没有与过滤器匹配),并导致错误。我希望它导致什么都不做。 我可以通过多种方法解决此问题。困扰我的是我不了解行为的差异...... – aggieNick02

+1

真实的例子是获取磁盘,过滤它们,然后运行Clear-Disk。我想人们会尝试这个脚本的可能性要小得多。 ;-) – aggieNick02

+0

@ aggieNick02这听起来像你需要在这种情况下的错误处理。尝试使用'{Try {$ _。GetType()} Catch {Write“$ _。Exception.Message”}}' – TheIncorrigible1

1

有一个perfect explanation

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

    感谢您的链接。这绝对是有趣和相关的,但除非我错过了一些东西,我不认为它解释了为什么在脚本和PowerShell提示中行为不同,是吗? – aggieNick02

    +0

    不,你说得对,错过了主要观点。奇怪的是,在一个脚本块中它会出错,也就是说,如果你把它放到一个函数/脚本块中,它也会在提示符上出错。它应该和输出数据一起。 – Curios