2012-05-02 202 views
1

模式[我是一個初學者使用PowerShell]從提取文件使用PowerShell

我想用PowerShell來提取某個目錄下的所有文件的特定模式。我怎麼做?

例如,讓文件的內容是:

<node1>Hello World ignore</node1> 
<wantedNode>Hello World extract 
this text </wantedNode> 

我想提取包含的 「Hello World」(不區分大小寫)類型的唯一節點:

"Hello World extract this text" 
+1

爲什麼要忽略node1?兩個節點都包含「hello world」... – Stefan

+0

這是我的要求 - 我想獲取所有包含Hello World類型的wantedNode節點 – Gjorgji

回答

1

Google上搜尋了一段時間後,我想出了一個解決方案:

$files = gci -Recurse 
foreach ($file in $files) 
{ 
    $x = [xml] (Get-Content $file.FullName) 
    foreach ($node in $x.SelectNodes("//wantedNode")) 
    {  
     if ($node.InnerText -like "*Hello World*") 
      { 
       Write-Host $node.InnerText 
      } 
    } 
} 
2

如果該文件是一個合適的XML文檔,那麼這很容易,例如:

Get-ChildItem *.xml | Select-Xml '//wantedNode' | Format-List Path, @{n="Text";e={$_.Node.InnerText}} 

如果XML文檔具有默認名稱空間,則獲取ab它更棘手但並不多。如果你需要做的正則表達式搜索則因爲感興趣的文本跨越多行你需要閱讀的文件作爲一個字符串如:

[IO.File]::ReadAllText("$pwd\test.xml") | 
    Select-String '(?s)(?<=\<wantedNode\>)(.*?)(?=\</wantedNode\>)' | 
    Format-List Matches 

在PowerShell中V3這變得有點簡單:

Get-Content .\test.xml -Raw | 
    Select-String '(?s)(?<=\<wantedNode\>)(.*?)(?=\</wantedNode\>)' | 
    Format-List Matches 
2

試試這個,我添加了一個根節點:

[xml][email protected]" 
<root> 
<node1>Hello World ignore</node1> 
<wantedNode>Hello World extract this text</wantedNode> 
</root> 
"@ 

$xml.SelectNodes("//wantedNode[contains(.,'Hello World')]") | foreach {$_.'#text'} 
相關問題