批处理中使用 powershell 替换字符串的另一种方法

批处理中使用 powershell 替换字符串的另一种方法

我编写了一个批处理脚本,用于替换指定文本文件中的字符串。在我的文件中,字符串OutDir=bin应该替换为,OutDir=Build但输出为bin=OutDir=Build=bin。如何转义=inOutDir=bin以使字符串不会乱码?我试过了,OutDir^=但使用 carrot 也不起作用。

这是我当前的脚本:

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

我试图改变查找和替换变量来补偿=我正在替换的字符串,但都没有起作用:

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"

答案1

=使用 PowerShell 批量替换字符串中的等号

经过测试和研究后,我发现StackOverflow 上的这个答案这也指向此主题和 DosTips 上的帖子而且=用纯净的批次替换并不容易。

当我遇到批处理脚本问题时,需要大量复杂的批处理逻辑,或者无法弄清楚如何轻松使其工作,我通常会尝试加入一些电源外壳因为它是视窗本机的,它可以比批处理更加强大,没有复杂的逻辑。

下面的批处理脚本基本上是:

脚本

@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

输出结果

OutDir=Build

更多资源

答案2

使用批处理函数进行字符串替换

可以使用以下函数。它不需要在末尾使用 GOTO :EOF,因为它总是自动退出。

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

要使用它,只需调用该函数,然后添加三个所需的参数:

要发送的变量、要查找的字符串以及要替换的字符串。

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

答案3

批处理中使用 powershell 替换字符串的另一种方法

我知道这是一篇旧帖子,但我想建议一种更简单的方法,使用 powershell 命令在批处理脚本中完成字符串替换。这还不错!

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%

上述示例使用了一个带有令人讨厌的“=”的变量,并将其替换为其他任意字符串“#”。为了更容易理解,我将批处理变量的变量名保留为大写,将 powershell 变量的变量名保留为小写。

为了使其能够更改文本文件中的字符串,您可以将一个 FOR 循环嵌套在另一个 FOR 循环中

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

上面的代码循环遍历文本文件中的行,进行替换,并创建一个包含所做更改的新文本文件。然后,您可以删除旧文本文件,并将新文件重命名为旧文件的名称。这是其中一种方法,当然还有其他方法。

相关内容