バッチ内でPowerShellを使用して文字列を置換する別の方法

バッチ内でPowerShellを使用して文字列を置換する別の方法

指定されたテキストベースのファイル内の文字列を置き換えるバッチ スクリプトを作成しました。ファイル内では、文字列OutDir=binは として置き換えられますOutDir=Buildが、 として出力されます。文字列が文字化けしないように をエスケープするにbin=OutDir=Build=binはどうすればよいでしょうか。試してみましたが、キャロットを使用しても機能しません。=OutDir=binOutDir^=

これが私の現在のスクリプトです:

@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

これを使用するには、関数を呼び出して、必要な 3 つのパラメータを追加するだけです。

送信する変数、検索する文字列、および置換する文字列。

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 変数の変数名は小文字にしました。

テキストファイル上の文字列を変更するには、1つの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

上記はテキスト ファイル内の行をループし、置換を行い、変更を加えた新しいテキスト ファイルを作成します。その後、古いテキスト ファイルを削除し、新しいファイルの名前を古いファイルの名前に変更することができます。これは 1 つの方法ですが、もちろん他の方法もあります。

関連情報