2011-05-17 20 views
9

Estoy analizando un archivo csproj para una instalación nuget y tengo un nodo que debe modificarse. El nodo en cuestión es el nodo llamado "Generator" donde su valor es igual a "TextTemplatingFileGenerator" y su nodo padre tiene un atributo de "WebConfigSettingsGeneratorScript.tt" (la segunda parte aún no está aquí).PowerShell analizar XML y guardar cambios

Aquí está el script que tengo, pero aún no está terminado. Está funcionando, pero guarda un archivo vacío. Además, no tiene la segunda parte de mi cláusula where, que es

$path = 'C:\Projects\Intouch\NuGetTestPackage\NuGetTestPackage' 
cd $path 
$files = get-childitem -recurse -filter *.csproj 
foreach ($file in $files){ 
    "" 
    "Filename: {0}" -f $($file.Name) 
    "=" * ($($file.FullName.Length) + 10) 

    if($file.Name -eq 'NuGetTestPackage1.csproj'){ 
     $xml = gc $file.FullName | 
     Where-Object { $_.Project.ItemGroup.None.Generator -eq 'TextTemplatingFileGenerator' } | 
     ForEach-Object { $_.Project.ItemGroup.None.Generator = '' } 
     Set-Content $file.FullName $xml 
    } 
} 

Aquí hay una versión básica del XML:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <None Include="T4\WebConfigSettingGeneratorScript.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>WebConfigSettingGeneratorScript.txt</LastGenOutput> 
    </None> 

muchas gracias. ¡Soy un PowerShell n00b total!

Respuesta

20

Como @empo dice, tiene que emitir la salida de gc $file.FullName a [xml] por ejemplo, $xml = [xml](gc $file.FullName). Y luego de realizar el cambio pero antes de pasar al siguiente archivo, debe guardar el archivo, p. $xml.Save($file.FullName).

Esto funciona con el proyecto de ejemplo que ya ha proporcionado:

$file = gi .\test.csproj 
$pattern = 'TextTemplatingFileGenerator' 
$xml = [xml](gc $file) 
$xml | Where {$_.Project.ItemGroup.None.Generator -eq $pattern} | 
     Foreach {$_.Project.ItemGroup.None.Generator = ''} 
$xml.Save($file.Fullname) 
+0

Esto ayuda, pero xml.Save $ ($ file.FullName) está subiendo como una operación no válida. –

+1

La única excepción que se ha documentado que XmlDocument.Save (ruta de la cadena) arroja es una XmlException si el XmlDocument correspondiente no está bien formado. Por cierto, también debería deshacerse del 'Set-Content $ file.FullName $ xml' ya que la llamada' $ xml.Save ($ file.Fullname) 'guardará nuevamente el archivo original. –

+0

Genial, he tomado los cambios que me has ofrecido. Pero, no parece estar haciendo el cambio al archivo. Sin embargo, la secuencia de comandos ES guardando el archivo. –

5

¿Echas de menos un molde?

 
$xml = [xml] gc $file.FullName