2012-02-10 32 views
6

Używam programu PowerShell do aktualizowania wykazu katalogu XML dla aplikacji na wielu serwerach, ale z problemem powodującym faktyczne aktualizacje. Na przykład za pomocą poniższego kodu XML, który chce zaktualizować ścieżki do plików za pomocą qualnas1, aby użyć czegoś takiego jak \ GlobalNAS ... itd. I usunąć wpis qualnas2.Aktualizowanie plików XML za pomocą programu PowerShell

<?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> 

Węzeł filepath z type = sssb działa, gdy używam $ _. InnerText, ale nie może znaleźć sposób, aby zaktualizować lub usunąć pozostałe węzły. Tu jest mój kodu:

$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' } 
} 

Jeśli I krok poprzez kod przy użyciu PowerGUI każdy węzeł znajduje i wymienić/usuń próby jak będę oczekiwać, ale albo się błędy (ciąg do konwersji XMLELEMENT) lub brak błędów ale nie ma żadnych aktualizacji w zależności od tego, jak wykonuję zadanie. W każdym razie, aby zmienić/usunąć określone węzły, jeśli nie ma atrybutów jak w przykładzie SSSB?

+0

Uwaga: ZachowajPrzestrzeń należy ustawić przed załadowaniem(). http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx – NYCdotNet

Odpowiedz

5

Chciałbym użyć trochę Xpath, aby uzyskać uchwyt do węzłów XML. Dla mnie jest to łatwiejsze niż użycie właściwości tworzonych przez PowerShell dla węzłów 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

Dzięki - spróbuję i dam ci znać, jak się okazuje. – AndyDrav

+2

Andy - podłączył to do mojego kodu i działa świetnie. Dzięki za pomoc! – AndyDrav

Powiązane problemy