
Este comando funciona para reemplazar instancias de OldText1
y OldText2
en OldText3
un archivo txt por NewText1
y NewText2
cuando NewText3
el comando está en una línea en un archivo por lotes como este:
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) -replace 'OldText1', 'NewText1' -replace 'OldText2', 'NewText2' -replace 'OldText3', 'NewText3' | Set-Content $_.FullName}"
Si intento usar el ^
símbolo para dividir el comando (que normalmente funciona en un archivo por lotes), no funciona. Por ejemplo, esto no funciona, no se reemplaza nada en el archivo txt:
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) ^
-replace 'OldText1', 'NewText1' ^
-replace 'OldText2', 'NewText2' ^
-replace 'OldText3', 'NewText3' ^
| Set-Content $_.FullName}"
El uso de comillas invertidas tampoco funciona (pero no funcionaría porque no es un script de PS1):
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) `
-replace 'OldText1', 'NewText1' `
-replace 'OldText2', 'NewText2' `
-replace 'OldText3', 'NewText3' `
| Set-Content $_.FullName}"
He estado preguntando al chatbot toda la mañana y no se me ocurre nada que funcione. La mitad del tiempo sigue poniendo el comando en una línea nuevamente y yo simplemente estoy dando vueltas en círculos con él.
¿Es imposible hacer lo que estoy intentando hacer?
La razón por la que quiero dividir el comando en varias líneas es simplemente porque quiero poder leer lo que se está reemplazando sin tener que mirar horizontalmente a lo largo de (lo que eventualmente será) un comando masivo. Tengo la intención de agregar muchos más comandos de reemplazo que este, pero no funciona ni siquiera para tres comandos de reemplazo... ¡todavía!
Gracias de antemano a cualquiera que pueda saber por qué esto no funciona.
Respuesta1
Esto no me queda claro:
Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_)
Esta parte sugiere que obtendrá elementos en una carpeta, precisamente elementos que son archivos, pero inmediatamente su comando define un archivo donde los reemplazos de cadenas se realizarán directamente en el contenido.
Mira, al eliminar esa parte, los reemplazos salieron como se esperaba, pero si se trata de varios archivos para los mismos reemplazos, sugeriría editar la pregunta. Aunque confuso, para el manejo de contenidos no necesitas " Get-ChildItem 'Old and New text.txt' | ...
", y puedes usar directamenteGet-Content 'Old and New text.txt' ^|...
start "Start PS1/CMD" /wait /min PowerShell.exe -c ^
"$Strings=Get-Content 'Old And New Text.txt' ^| %% ^
^{ $_ -replace('OldText1','NewText1')^
-replace('OldText2','NewText2')^
-replace('OldText3','NewText3')^}^
; sc 'Old And New Text.txt' -Value $Strings -Force"