He estado trabajando en esto durante un par de horas y no puedo entender qué me estoy perdiendo. Básicamente, obtengo una lista de todos los archivos XML en una carpeta y subcarpetas. Al recorrer estos archivos, reemplazo una cadena por otra y la vuelvo a escribir en el mismo archivo. A continuación se muestra la línea con la que estoy trabajando:

$destination = "C:\Temp\TestFolder"
$newString = "#NewString#"

Get-ChildItem '$($destination)*.xml' -Recurse | ForEach {
    $currFile = $_.FullName; 
    (Get-Content $_ | ForEach {
        $_ -Replace '#OldString#', '$($newString)'
    }) | Set-Content -Path $currFile;
}
0
Just Rudy 11 ene. 2017 a las 19:40
1
Hola, cual es el problema? ¿Recibes algún mensaje de error?
 – 
sodawillow
11 ene. 2017 a las 19:56
2
'$($destination)\*.xml' (observe la barra invertida)
 – 
Mathias R. Jessen
11 ene. 2017 a las 20:06
2
O Get-ChildItem $destination *.xml -Recurse
 – 
Mathias R. Jessen
11 ene. 2017 a las 20:06
1
Con $destination ahora conocido, esto parece obvio.
 – 
sodawillow
11 ene. 2017 a las 20:09
1
Solución más genérica: Get-ChildItem (Join-Path $destination *.xml) -Recurse
 – 
Mathias R. Jessen
11 ene. 2017 a las 20:13

1 respuesta

La mejor respuesta

El problema es que en realidad no está apuntando al directorio correcto.

Cuando ejecuta este comando:

Get-ChildItem '$($destination)*.xml' -Recurse 

Estás usando comillas simples. Las comillas simples no permiten la expansión de cadenas, como está intentando hacer con $($destination). Cuando PowerShell ejecuta esto, en realidad busca archivos en una ruta llamada $ ($ destino), que no va a existir.

En su lugar, reemplácelas con comillas dobles o, mejor aún, elimínelas por completo.

Get-ChildItem $destination\*.xml -Recurse 

Finalmente, no necesita usar un ciclo For-Each para reemplazar todas las instancias de esa cadena. Es posible llamar a Get-Content, luego llamar a replace y finalmente establecer el valor en una línea, así:

$files = Get-ChildItem $destination\*.xml -Recurse 
ForEach ($file in $files){ 
  Set-Content ((Get-Content $File.FullName) -Replace '#OldString#', $newString) `
    -Path $file.fullname 
}
3
FoxDeploy 11 ene. 2017 a las 20:17