2011-08-23 26 views
6

我在看到這個PowerShell的說法最近Hanselminutes post -

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique 

我努力學習Powershell的此刻,我認爲我最瞭解什麼是怎麼回事 -

  • 聲明遍歷「的test.txt」的每一行,並違背了當前行正則表達式
  • 所有的結果整理,然後進行排序和刪除重複

我的理解,似乎倒在語句的這一部分 -

$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x 
  • 什麼是代碼的「$null =」部分做,我懷疑這是 處理的方案時,不匹配返回,但我不知道如何 它的作品?
  • '$matches.x'是否返回找到的匹配?

回答

8

是的,-match運營商的結果是TrueFalse;分配給$null會抑制輸出。

(?<>) regex語法創建一個捕獲組。在這種情況下,它將爲<FancyPants><.FancyPants>之間的任何字符創建一個名爲x的捕獲組。 $matches包含最後一場比賽的比賽信息。捕獲組可由$matches.CaptureGroupName引用。

下面是一個示例,您可以使用該示例查看$Matches變量中的內容。

'123 Main','456 Broadway'| foreach{$_; $null = $_ -match '(?<MyMatch>\d+)'; ($Matches| ft *)} 

在此示例中,您將使用$Matches.MyMatch來引用匹配。

+0

因此'$ matches.x'包含當前對象的匹配,PS會自動將所有'$ matches'結果集合到一個大的結果集中嗎? – ipr101

+0

@ ipr101不,它只保留最後一場比賽。我用一個可以用來查看'$ Matches'變量中的內容的示例更新了我的答案。 – Rynant

+0

謝謝,現在更有意義 – ipr101

5

'$ null = ...'用於抑制比較結果。你可能已經見過類似的東西,如:

command | Out-Null 

在上面,將外空cmdlet用於抑制輸出。在某些情況下,你可能會看到這個問題,以及:

[void] (...) 

基本上,所有的例子做同樣的事情,忽略輸出。如果您沒有使用上述任何一種結果,則結果將回寫到管道,並且您可能會收到來自管道中進一步下達的命令的意外結果。

+1

請參閱http://stackoverflow.com/questions/5260125/whats-the-better-cleaner-way-to-ignore-output-in-powershell –

+0

謝謝。我記得PowerShell團隊(來自James Brundage?)的一篇文章,但我找不到它。 –