He creado un script por lotes que reemplaza cadenas en un archivo basado en texto específico. Dentro de mi archivo, la cadena OutDir=bin
debe reemplazarse como OutDir=Build
pero el resultado es bin=OutDir=Build=bin
. ¿Cómo puedo escapar del =
in OutDir=bin
para que la cadena no se confunda? Lo he intentado OutDir^=
pero usar la zanahoria tampoco funciona.
Aquí está mi guión actual:
@echo off
setlocal enableextensions disabledelayedexpansion
set search=OutDir=bin
set replace=OutDir=Build
set textFile=%DOCUMENT%.txt
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%search%=%replace%!
endlocal
)
Intenté cambiar las variables de búsqueda y reemplazo para compensar la =
cadena que estoy reemplazando, pero ninguna funcionó:
set search= "OutDir=bin"
set replace= "OutDir=Build"
set search="OutDir=bin"
set replace="OutDir=Build"
set "search=OutDir=bin"
set "replace=OutDir=Build"
"set search=OutDir=bin"
"set replace=OutDir=Build"
Respuesta1
Reemplazo del símbolo igual =
en una cadena con lote usando PowerShell
Después de probar y luego investigar, encontréesta respuesta en StackOverflowque luego también señalóeste hilo y publicaciones en DosTipsy reemplazarlo =
con un lote puro no es fácil.
Cuando tengo problemas con las secuencias de comandos por lotes en los que se necesita un montón de lógica por lotes compleja o simplemente no puedo encontrar la manera de hacer que funcione fácilmente, normalmente intento incorporar algunosPotencia Shellen la mezcla ya que esventanasnativo y puede ser mucho más robusto que el lote sin una lógica compleja.
El siguiente script por lotes esencialmente:
- UsarObtener el contenidoyReemplazarpara que la cadena busque y reemplace
- Entonces usaráContenido del conjuntopara volver a colocar la cadena recién reemplazada en el archivo en consecuencia
Guion
@echo off
setlocal enableextensions disabledelayedexpansion
set search=OutDir=bin
set replace=OutDir=Build
set textFile=%DOCUMENT%.txt
:PowerShell
SET PSScript=%temp%\~tmpStrRplc.ps1
ECHO (Get-Content "%~dp0%textFile%").replace("%search%", "%replace%") ^| Set-Content "%~dp0%textFile%">"%PSScript%"
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
EXIT
Resultado de salida
OutDir=Build
Recursos adicionales
Respuesta2
Usando una función por lotes para reemplazar cadenas
Se puede utilizar la siguiente función. No necesita un GOTO :EOF al final porque siempre sale por sí solo.
setlocal enableextensions disabledelayedexpansion
:l_replace
SET "TEMP=x%~1x"
:l_replaceloop
FOR /f "delims=%~2 tokens=1*" %%x IN ("!TEMP!") DO (
IF "%%y"=="" set "TEMP=!TEMP:~1,-1!"&exit/b
set "TEMP=%%x%~3%%y"
)
GOTO :l_replaceloop
Para usarlo simplemente llame a la función y luego agregue los tres parámetros necesarios:
La variable a enviar, la cadena a buscar y la cadena con la que reemplazarla.
CALL :l_replace "!VARIABLE!" "=" "#"
SET VARIABLE=!TEMP!
Respuesta3
Otro método para usar PowerShell dentro del lote para reemplazar cadenas
Sé que esta es una publicación antigua en este momento, pero pensé en sugerir una forma mucho más sencilla de realizar el reemplazo de cadenas en un script por lotes usando un comando de PowerShell. ¡No es tan malo!
setlocal enableextensions disabledelayedexpansion
SET "OLDSTRING=stuff=stuff"
FOR /F "delims=" %%A IN ('powershell -Command "$oldstring ='%OLDSTRING%'; $newstring = $oldstring -replace '=', '#'; $newstring"') DO SET "NEWSTRING=%%A"
ECHO %NEWSTRING%
El ejemplo anterior utiliza una variable con algo desagradable '=' y la reemplaza con otra cadena arbitraria '#'. Para que sea más fácil de seguir, mantuve los nombres de las variables en mayúsculas para las variables por lotes y en minúsculas para las variables de PowerShell.
Para que funcione para cambiar cadenas en un archivo de texto, puede anidar un bucle FOR dentro de otro.
setlocal enableextensions disabledelayedexpansion
FOR /F "delims=" %%B IN ('type textfile.txt') DO (
FOR /F "delims=" %%A IN ('powershell -Command "$oldstring ='%%B'; $newstring = $oldstring -replace '=', '#'; $newstring"') DO ECHO %%A>>newtextfile.txt
Lo anterior recorre las líneas de un archivo de texto, realiza el reemplazo y crea un nuevo archivo de texto con los cambios realizados. Luego puede eliminar el archivo de texto antiguo y cambiar el nombre del archivo nuevo por el nombre del archivo antiguo. Esta es una forma de hacerlo, hay otras, por supuesto.