2014-09-10 19 views
-1

下面是一些PowerShell輸出。有人可以向我解釋包括|的區別嗎? ? {$ _},不包括它(除了明顯的視覺輸出差異)?這不是一個更大的腳本或任何東西的一部分,我開始使用PowerShell,並試圖瞭解一些基本的複雜性。我明白使用正則表達式部分。

PS C:\Users\oucs0058> $pc = "123456789ABCDE" 
PS C:\Users\oucs0058> $pc -split '(..)' 

12 

34 

56 

78 

9A 

BC 

DE 

PS C:\Users\oucs0058> $pc -split '(..)' | ? {$_} 
12 
34 
56 
78 
9A 
BC 
DE 
+0

'? {$ _}'將其讀作:'實際值管道不爲空' – 2014-09-10 10:34:24

+0

當然沒有任何空值? (或者肯定會有第一個輸出)。爲什麼有空? – Daz 2014-09-10 10:36:30

+0

實際上,它不是空值,而是空字符串。但是,當轉換爲布爾值時,'$ null'是'$ false',所以這沒有任何區別(請參閱我在鑄造中的回答)。 – PeterK 2014-09-10 10:45:52

回答

3

當你使用?速記,你實際使用Where-Object cmdlet的。此cmdlet將評估參數腳本塊,該塊應返回一個布爾值。如果評估返回$true,則輸入對象向下傳遞,如果評估返回$false,則輸入對象將被忽略。例如,Where-Object $true將傳遞所有輸入對象,並且Where-Object $false不會傳遞任何對象。

腳本塊可以是任何東西,但其結果被轉換爲布爾值。因此,當您編寫{$_}時,您正在將輸入字符串對象轉換爲布爾值。 PowerShell將空字符串轉換爲$false,將非空字符串轉換爲$true

您的$pc -split '(..)'命令返回一個字符串對象列表,其中每個字符串對象爲空。因此,{$_}將返回$false空字符串和$true非空字符串,其餘如果非常簡單:Where-Object將傳遞非空字符串並忽略空字符串。 HTH。

+0

感謝您的信息。那麼爲什麼每當第二個字符串在第一個地方進行拆分時都是空的? – Daz 2014-09-10 10:49:01

+0

好問題,我__思考.NET .NET String.split()行爲,它表示_「如果多個匹配彼此相鄰,則將一個空字符串插入到數組中。」_(來自http:// msdn.microsoft.com/en-us/library/ze12yx1d(v=vs.110).aspx)。這個條件由輸入+正則表達式滿足。 – PeterK 2014-09-10 11:01:55

+0

偉大的信息和MSDN鏈接的+1! – Daz 2014-09-10 11:23:39