另一種在批次中使用 powershell 取代字串的方法

另一種在批次中使用 powershell 取代字串的方法

我製作了一個批次腳本,用於替換指定的基於文字的文件中的字串。在我的文件中,該字串OutDir=bin應替換為,OutDir=Build但輸出為bin=OutDir=Build=bin.如何轉義=inOutDir=bin以使字串不會變成亂碼?我已經嘗試過OutDir^=,但使用胡蘿蔔也不起作用。

這是我目前的腳本:

@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 迴圈嵌套在另一個迴圈中

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

上面的程式碼循環遍歷文字檔案中的行,進行替換,並使用所做的變更建立一個新的文字檔案。然後,您可以刪除舊的文字檔案並將新檔案重新命名為舊檔案的名稱。這是一種方法,當然還有其他方法。

相關內容