2016-09-29 86 views
1

我一直試圖找出這一個現在一段時間,但我似乎無法弄清楚這兩者之間的區別。特別是,差異,因爲它們涉及到一組數據:

PS C:>$myarray = "a", "ab", "abc" 
PS C:>$myarray -match "b" 
ab 
abc 
PS C:>$myarray | where {$_ -match "b"} 
ab 
abc 

誰能幫助我明白了什麼,如果有的話,區別是這兩個選項之間?

謝謝!

回答

3

結果至少沒有。一個是將一個比較運算符應用於一個數組(這意味着它將應用於每個數組元素,而那些返回的數組元素將返回)。另一個是將數組傳遞給過濾的cmdlet。結果是一樣的。

你可以發揮創意和解決另一種方式同樣的事情:

$myarray | foreach { if ($_ -match 'b') { $_ } } 

不過請注意,當左操作數不是一個數組,其結果是不同的:

PS Home:\> ,'b' -match 'b' 
b 
PS Home:\> 'b' -match 'b' 
True 

所以,如果你有,你是不知道它是否是一個數組或者不是你既可以強制它是一個變量:

@($foo) -match 'b' 

或使用Where-Object這將做正確的事情。


就我個人而言,我傾向於直接在控制檯編寫PowerShell代碼時使用操作符。它使一個不錯的簡潔grep等同得好:

(gc file) -match 'regex' 

(我真的應該開始使用Select-String更多的時候,雖然)。

但編寫需要腳本時,我用的是「正確」的方式與Where-Object強健或其他人必須閱讀/維護。

+0

完全哦,我可以告訴大家,結果似乎永遠是一樣的,但我只是想確認有沒有一些細節或細節是使它們在使用上截然不同。 非常感謝(特別是對於編輯!),爲我清除了一切! –

+0

只是我的2美分,我發現'選擇字符串'是非常快的。 – sodawillow

+0

@sodawillow好奇,我該如何利用'Select-String'來完成這樣的事情?我已經閱讀了一些,但我不太明白它的作用。 –

2
  • $array -match 'value' - 直接檢查每個值的字符串表示,這是非常快速的(在大型陣列尤其明顯)
  • $array | where { $_ -match 'value' } - 在每個項目上執行腳本塊,因此:
    • 調用開銷(顯在大陣列上它可以減緩處理很多)
    • 靈活性和複雜條件
    • 屬性can使用
    • 額外的動作可以執行
+0

這也是超級有用,謝謝一堆! –