2013-04-08 88 views
2

最近我不得不檢查當我的腳本執行時是否發生了一些錯誤。首先我試着檢查$ Error是否爲$ null。對我而言,奇怪的是我沒有得到任何結果(既不是真也不是假)。然後我寫道:

if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"} 

沒有什麼是在輸出。這讓我非常困惑。我發現這樣的事情發生在System.Collections.ArrayList類型的所有變量上。

也許有人知道解釋爲什麼發生這種情況,因爲對我來說這看起來像一個錯誤?

我發現這個版本的Powershell版本是3.0。

回答

5

@mjolinor's答案試圖解釋它,但是不完整。

當你做(1,2,3) -eq 1,你找回1。在這種情況下,-eq對數組的作用是返回等於RHS的元素,如果不匹配,則返回無。

另一方面,如果你這樣做1 -eq (1,2,3),你會得到False,因爲只有當數組是LHS時纔會發生上述情況。所以,當涉及到數組時,-eq運算符的行爲與上述情況相比並非如此。

現在,使用-ne。當你做(1,2,3) -ne 1,你得到陣列2,3。也就是說,它返回的是不等於RHS的元素。而類似-eq1 -ne (1,2,3),將返回True

來到你的條件 - ($error -eq $null) -or ($error -ne $null)

$error是空的,$error -eq $null將返回任何結果(並因此False在布爾語句)。這當然是因爲在$ error中沒有匹配$null的元素。此外,$error -ne $null也不會返回任何內容(因此在bool語句中爲False),因爲$ error是空的,並且其中沒有非$ null的元素。

因此,當$error爲空時,您的語句將爲false,並且if內部的塊將不會執行。

如果$error不是空的,則任一情況都是如此,並且您會看到執行了write-host

那麼你如何真正解決這個問題呢?

直接的方法是檢查$error數組的長度:

if($error.length -gt 0){ 
    write-host "error occured" 
} 

此外,閱讀這篇文章,討論各種錯誤處理策略 - http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/12/powershell-error-handling-and-why-you-should-care.aspx

+0

關於該答案的「錯誤」究竟是什麼? – mjolinor 2013-04-08 04:22:47

+0

@mjolinor - '因此,-eq操作符在數組方面總是表現得像上述情況一樣。 – manojlds 2013-04-08 04:30:24

+0

@mjolinor - 答案的正確答案是什麼?對不起,它甚至沒有提到OP在這個問題中使用的'-ne'。 – manojlds 2013-04-08 04:33:29

1

當-eq運算符用於數組(或arraylist)時,它會返回滿足條件的數組的所有成員。

($ error -eq $ null)說:「我希望所有的$ error arraylist的成員都是空值。」它不能返回任何東西,但$ null。

當您在IF中使用它時,結果將被轉換爲[bool]。當作爲[bool]轉換時,$ Null的計算結果爲$ false。

($ error -eq $ null)永遠不會爲True。

$x = new-object collections.arraylist 

[void]$x.Add('a') 
[void]$x.add('b') 

($x -eq $null).count 
[bool]($x -eq $null) 

[void]$x.Add($Null) 

($x -eq $null).count 
[bool]($x -eq $null) 


0 
False 
1 
False 
+0

有趣'((1,$空,2)-eq $ null)[0] -eq $ null'' -eq'輸出和數組 – 2013-04-08 06:39:15