1

【PowerShell初心者です】

PowerShell を使用して、特定のディレクトリの下にあるすべてのファイルから特定のパターンを抽出したいと考えています。それ、どうやったら出来るの?

たとえば、ファイルの内容を次のようにします。

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

「hello world」を含むタイプのノードのみを抽出したい (大文字と小文字を区別しない):

"Hello World extract this text"
4

3 に答える 3

2

これを試してください。ルートノードを追加しました:

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

$xml.SelectNodes("//wantedNode[contains(.,'Hello World')]") | foreach {$_.'#text'}
于 2012-05-02T19:55:02.837 に答える
2

ファイルが適切な XML ドキュメントである場合、これは非常に簡単です。

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

XML ドキュメントにデフォルトの名前空間がある場合、これは少し複雑になりますが、大したことではありません。正規表現検索を行う必要がある場合は、対象のテキストが複数行にまたがるため、ファイルを単一の文字列として読み取る必要があります。

[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
于 2012-05-02T19:53:51.647 に答える
1

しばらくグーグルで調べた後、解決策を思いつきました:

$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
            } 
    }
}
于 2012-05-02T22:38:47.693 に答える