2012-02-10 16 views
6

Estoy usando PowerShell para actualizar una lista de directorios XML para una aplicación en varios servidores pero teniendo un problema al realizar las actualizaciones. Usando el siguiente XML como ejemplo, buscando actualizar los filepaths con qualnas1 para usar algo como \ GlobalNAS ... etc. y eliminar la entrada de qualnas2.Actualización de archivos XML con 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> 

El nodo rutaarchivos type = SSSB funciona cuando se utiliza el $ _. InnerText, pero no puede encontrar una manera de actualizar o eliminar los otros nodos. Aquí está mi código:

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

Si me paso a través del código utilizando PowerGUI cada nodo se encuentra y el reemplazar/remover se trató como yo esperaría, pero o bien obtener errores (cadena a la conversión XmlElement) o sin errores pero no hay actualizaciones dependiendo de cómo hago la asignación. De todos modos para cambiar/eliminar nodos específicos si no hay atributos como en el ejemplo de SSSB?

+0

Nota: PreserveWhitespace se debe establecer antes de cargar(). http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx – NYCdotNet

Respuesta

5

Usaría un pequeño Xpath para obtener un control de los nodos XML. Para mí, es más fácil que usar las propiedades que PowerShell crea para los nodos 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

Gracias - Voy a intentarlo y le contaré cómo resulta. – AndyDrav

+2

Andy: lo conecté a mi código y funciona muy bien. ¡Gracias por la ayuda! – AndyDrav

Cuestiones relacionadas