2012-02-10 27 views
6

Utilizzo PowerShell per aggiornare un elenco di directory XML per un'applicazione su un numero di server, ma che presenta un problema relativo agli aggiornamenti effettivi. Usando il seguente XML come esempio, cercando di aggiornare i percorsi di file con qualnas1 per usare qualcosa come \ GlobalNAS ... etc e rimuovere la voce qualnas2.Aggiornamento di file XML tramite 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> 

Il nodo percorsofile con type = SSSB funziona quando uso il $ _. InnerText, ma non riesce a trovare un modo per aggiornare o rimuovere gli altri nodi. Qui è il mio codice:

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

Se io passo attraverso il codice usando PowerGUI ogni nodo viene trovato e la sostituzione/rimozione è tentato come mi aspetto, ma o ottenere gli errori (stringa alla conversione XmlElement) o nessun errore ma nessun aggiornamento a seconda di come eseguo l'assegnazione. Ad ogni modo per cambiare/rimuovere nodi specifici se non ci sono attributi come nell'esempio SSSB?

+0

Nota: PreserveWhitespace deve essere impostato prima di Load(). http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx – NYCdotNet

risposta

5

Vorrei usare un po 'di Xpath per ottenere un handle per i nodi XML. Per me è più semplice dell'utilizzo delle proprietà create da PowerShell per i nodi 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

Grazie - Darò una prova e ti faccio sapere come andrà a finire. – AndyDrav

+2

Andy - l'ho inserito nel mio codice e funziona alla grande. Grazie per l'aiuto! – AndyDrav