Outro método de usar o PowerShell em lote para substituir strings

Outro método de usar o PowerShell em lote para substituir strings

Criei um script em lote que substitui strings em um arquivo específico baseado em texto. Dentro do meu arquivo, a string OutDir=bindeve ser substituída como OutDir=Buildmas obtém saída como bin=OutDir=Build=bin. Como faço para escapar do =in OutDir=binpara que a string não fique distorcida? Eu tentei OutDir^=, mas usar a cenoura também não funciona.

Aqui está meu script atual:

@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
    )

Tentei alterar as variáveis ​​de localização e substituição para compensar a =string que estou substituindo, mas nenhuma funcionou:

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"

Responder1

Substituindo o símbolo de igual =em uma string por lote usando PowerShell

Depois de testar e pesquisar, descobriesta resposta no StackOverflowque então também apontou paraeste tópico e postagens no DosTipse substituir o =por lote puro não é fácil.

Quando me deparo com problemas com scripts em lote, onde é necessária uma tonelada de lógica complexa em lote ou simplesmente não consigo descobrir como fazê-lo funcionar facilmente, geralmente tento incorporar algunsPowerShellna mistura, já que éjanelasnativo e pode ser muito mais robusto que o lote sem lógica complexa.

O script em lote abaixo irá essencialmente:

Roteiro

@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 saída

OutDir=Build

Recursos adicionais

Responder2

Usando uma função em lote para substituição de string

A seguinte função pode ser usada. Não precisa de GOTO :EOF no final porque sempre sai por conta própria.

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 usá-lo basta chamar a função e adicionar os três parâmetros necessários:

A variável a ser enviada, a string a ser procurada e a string pela qual substituí-la.

CALL :l_replace "!VARIABLE!" "=" "#"
SET VARIABLE=!TEMP!

Responder3

Outro método de usar o PowerShell em lote para substituir strings

Eu sei que este é um post antigo neste momento, mas pensei em sugerir uma maneira muito mais simples de realizar a substituição de string em script em lote usando um comando do PowerShell. Não é tão ruim!

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%

O exemplo acima usa uma variável com algo desagradável '=' e a substitui por alguma outra string arbitrária '#'. Para facilitar o acompanhamento, mantive os nomes das variáveis ​​​​em maiúsculas para variáveis ​​​​em lote e em minúsculas para as variáveis ​​​​do PowerShell.

Para fazer funcionar a alteração de strings em um arquivo de texto, você pode aninhar um loop FOR dentro de outro

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

O procedimento acima percorre as linhas de um arquivo de texto, faz a substituição e cria um novo arquivo de texto com as alterações feitas. Você poderia então excluir o arquivo de texto antigo e renomear o novo arquivo com o nome do arquivo antigo. Esta é uma maneira de fazer isso, existem outras, é claro.

informação relacionada