Tengo varios archivos de configuración en Windows Server 2008 anidados como tales:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
En mi configuración, necesito hacer un reemplazo de cadena como tal:
<add key="Environment" value="Dev"/>
se convertirá:
<add key="Environment" value="Demo"/>
Pensé en usar secuencias de comandos por lotes, pero no había una buena manera de hacerlo, y escuché que con las secuencias de comandos de PowerShell puede realizar esto fácilmente. He encontrado ejemplos de buscar / reemplazar, pero esperaba una forma de atravesar todas las carpetas dentro de mi directorio C: \ Proyectos y encontrar cualquier archivo que termine con la extensión '.config'. Cuando encuentre uno, quiero que reemplace mis valores de cadena.
¿Algún buen recurso para descubrir cómo hacer esto o cualquier gurú de PowerShell que pueda ofrecer alguna información?
powershell
scripting
replace
find
Brandon
fuente
fuente
Respuestas:
Aquí un primer intento en la parte superior de mi cabeza.
fuente
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
después dells
. Fui picado por eso yo mismo.PowerShell es una buena opción;) Es muy fácil enumerar archivos en un directorio dado, leerlos y procesarlos.
El guión podría verse así:
Divido el código en más líneas para que pueda leerlo. Tenga en cuenta que puede usar Set-Content en lugar de
[IO.File]::WriteAllText
, pero agrega una nueva línea al final. ConWriteAllText
usted puede evitarlo.De lo contrario, el código podría tener este aspecto:
$c | Set-Content $_.FullName
.fuente
Este enfoque funciona bien:
fuente
Get-Content $_
conGet-Content $_.FullName
el equivalente paraSet-Content
manejar archivos que no estaban en la raíz.Yo iría con xml y xpath:
fuente
Este ejemplo de PowerShell busca todas las instancias de la cadena "\ foo \" en una carpeta y sus subcarpetas, reemplaza "\ foo \" con "\ bar \" Y NO ESCRIBE los archivos que no contienen la cadena "\ foo \ "De esta manera no destruye los sellos de fecha y hora de la última actualización del archivo donde no se encontró la cadena:
fuente
Encontré útil el comentario de @Artyom pero desafortunadamente no ha publicado una respuesta.
Esta es la versión corta, en mi opinión la mejor versión, de la respuesta aceptada;
fuente
foreach-object
lugar del%
alias al ejecutar un comando como este. De lo contrario, puede provocar el error:Expressions are only allowed as the first element of a pipeline
He escrito una pequeña función auxiliar para reemplazar el texto en un archivo:
Ejemplo:
fuente
Al realizar un reemplazo recursivo, se debe incluir la ruta y el nombre de archivo:
Esto reemplazará todo "viejo" con "nuevo" distingue entre mayúsculas y minúsculas en todos los archivos de sus carpetas de su directorio actual.
fuente