2017-06-20 30 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