2017-12-05 61 views
0

まず、thisを参考にしたいと思います。これは、PowerShellスクリプトのマイナーな変更に基づいています。特定の属性を含む複数のXMLファイル内の要素を削除する

変更されたスクリプトの目標は、フォルダー内のすべてのXMLを調べ、オブジェクト内にオブジェクトが存在し、ソースファイルが.epsで終わるところにオブジェクトとすべてを削除することです内に上記の参照されたリンクから、属性のすべてのオブジェクトが確実に考慮されるように見えました。私はワイルドカードを使用しようとしましたが、それを実行するとエラーは出ませんでしたが、2番目のオブジェクトタグも削除されませんでした。ここで

は、オブジェクト/オブジェクトのサンプルXMLである:ここで

<object class="graphic svg eps file_name:AR1.svg name:AR1" data="sample.svg"  height="100" type="image/svg+xml" width="100"> 
    <object class="graphic svg eps file_name:AR1.eps name:AR1" data="sample.eps" height="400" type="application/postscript" width="400"> 
     <p>NONE</p> 
    </object> 
</object> 

は変形例である:

Get-ChildItem 'C:\test\*.xml' | ForEach-Object { 
    $xml = [xml](Get-Content $_.FullName) 

    $xml.SelectNodes("//object/object") | Where-Object { 
    $_.class -eq "*" -and 
    $_.data -eq "*.eps" -and 
    $_.height -eq "*" -and 
    $_.type -eq "application/postscript" -and 
    $_.width -eq "*" 
    } | ForEach-Object { 
    $_.ParentNode.RemoveChildNode($_) 
    } 

    $xml.Save($_.FullName) 
} 

私はワイルドカードはまだ動作するはずという印象の下にあった、と属性を持つため、ワイルドカードはXMLファイル名と画像ファイル名に基づいてランダムに表示され、ワイルドカードを使用するのが最適です。

私は非常に緑色で、PowerShellの新機能ですが、何か助けていただければ幸いです。

編集:

@TheMadTechnicianの助けを借りて、私はどの作品以下にスクリプトを更新しました!

$items | ForEach-Object { 
     $xml = [xml](Get-Content $_.FullName) 

     $xml.SelectNodes("//*[@type='application/postscript']") | %{ $_.parentnode.removechild($_) } 

     $xml.Save($_.FullName) 

答えて

2

問題はWhereステートメントが機能しないことです。文字通りあなたが

ワイルドカードであることを示すものを等しい

$xml.SelectNodes("//object/object") | Where-Object { 
    $_.class -eq "*" -and 
    $_.data -eq "*.eps" -and 
    $_.height -eq "*" -and 
    $_.type -eq "application/postscript" -and 
    $_.width -eq "*" 
} 

それらの1つだけがTrueに評価されているため何も返さない、そしてそれがタイプです:あなたはちょうどそのコマンドの最初の部分を実行する場合は、これを見ることができます素晴らしいですが、適切に使用する必要があります。 -eq演算子はリテラルであり、ワイルドカードは受け入れません。だから$_.class*だけの文字列であるとき$trueを返す$_.class -eq "*"と言うとき。あなたはのようなワイルドカードを使用すると、-like演算子です。

$xml.SelectNodes("//object[contains(@data,'.eps') and @type='application/postscript']") | 
Where-Object { 
    $_.data -like "*.eps" -and 
    $_.type -eq "application/postscript" 
    }|%{$_.parentnode.removechild($_)} 

これは、すべてのより良いXPathクエリを簡素化することができます。

$xml.SelectNodes("//object[contains(@data,'.eps') and @type='application/postscript']") | %{ $_.ParentNode.RemoveChild($_) } 
+0

は、お返事ありがとうございました!私はXPathの詳細を読む – parsnup

関連する問題