Otro método para usar PowerShell dentro del lote para reemplazar cadenas

Otro método para usar PowerShell dentro del lote para reemplazar cadenas

He creado un script por lotes que reemplaza cadenas en un archivo basado en texto específico. Dentro de mi archivo, la cadena OutDir=bindebe reemplazarse como OutDir=Buildpero el resultado es bin=OutDir=Build=bin. ¿Cómo puedo escapar del =in OutDir=binpara 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:

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.

información relacionada