2012-02-10 12 views
6

PowerShellを使用して、多数のサーバー間でアプリケーションのXMLディレクトリ一覧を更新していますが、実際の更新に問題があります。例として次のXMLを使用して、\ GlobalNAS ...などのようなものを使用するようにqualnas1でファイルパスを更新し、qualnas2エントリを削除します。PowerShellを使用してXMLファイルを更新する

<?xml version="1.0" encoding="UTF-8" ?> 
<directory> 
    <filepath>\\qualnas1\library\content</filepath> 
    <filepath>\\qualnas2\library\content</filepath> 
    <filepath type="sssb">\\qualnas1\SSSB\content</filepath> 
</directory> 

タイプ= SSSBとファイルパスのノードは、私は$ _。InnerTextプロパティを使用するときに動作しますが、更新したり、他のノードを削除する方法を見つけることができません。ここに私のコードです:私は、Powerguiブロックを使用してコードをステップ実行した場合、各ノードが見つからないとエラー(のXmlElementへの変換文字列)を取得、私は期待通り/削除が試行された置き換えるが、いずれか、またはエラーさ

$DirectoryXMLPath = 'C:\Temp\directory.xml' 
if (Test-Path $DirectoryXMLPath) 
{ 
    $DirectoryXML = New-Object XML 
    $DirectoryXML.Load($DirectoryXMLPath) 
    $DirectoryXML.PreserveWhitespace = $true 

    # Find qualnas1 path and replace with GlobalNAS 
    $DirectoryXML.directory.filepath | Where-Object { $_ -eq '\\qualnas1\library\content' } | 
     ForEach-Object { $_.InnerText = '\\GlobalNAS\library\content' } 

    # Find extraneous library paths and remove them 
    $DirectoryXML.directory.filepath.Remove('\\qualnas2\library\content') 
# $DirectoryXML.directory.mountpoint | Where-Object { $_ -eq '\\qualnas2\library\content' } | 
#  ForEach-Object { $DirectoryXML.RemoveChild($_) } 

    # This line is good! Need InnerText as attribute type exists 
    $DirectoryXML.directory.filepath | Where-Object { $_.InnerText -eq '\\qualnas1\SSSB\content' } | 
     ForEach-Object { $_.InnerText = '\\GlobalNAS\SSSB\content' } 
} 

どのように私が割り当てを行うかに応じて更新もありません。とにかく、SSSBの例のような属性がない場合、特定のノードを変更/削除するには?

+0

注意:PreserveWhitespaceは、Load()の前に設定する必要があります。 http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx – NYCdotNet

答えて

5

Xpathを少し使ってXMLノードのハンドルを取得します。 PowerShellがXMLノード用に作成するプロパティを使用するよりも簡単です。

# Find qualnas1 path and replace with GlobalNAS 
$DirectoryXML.SelectNodes('/directory/filepath') | ? { 
     $_.InnerText -eq '\\qualnas1\library\content' 
    } | % { 
     $_.InnerText = '\\GlobalNAS\library\content' 
    } 

# Find extraneous library paths and remove them 
$DirectoryXML.SelectNodes('/directory/filepath') | ? { 
     $_.InnerText -eq '\\qualnas2\library\content' 
    } | % { 
     $_.ParentNode.RemoveChild($_) 
    } 
+0

ありがとうございます - 私はそれを試して、それがどのように判明したかを教えてあげます。 – AndyDrav

+2

Andy - それを私のコードに差し込み、素晴らしい作品です。助けてくれてありがとう! – AndyDrav

関連する問題