문자열을 대체하기 위해 배치 내에서 powershell을 사용하는 또 다른 방법

문자열을 대체하기 위해 배치 내에서 powershell을 사용하는 또 다른 방법

지정된 텍스트 기반 파일의 문자열을 바꾸는 배치 스크립트를 만들었습니다. 내 파일 내에서 문자열은 OutDir=bin다음으로 바뀌어야 OutDir=Build하지만 출력은 bin=OutDir=Build=bin. 문자열이 왜곡되지 않도록 =in을 어떻게 이스케이프 처리합니까 ? OutDir=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 루프를 다른 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

위의 코드는 텍스트 파일의 줄을 반복하고 교체를 수행하며 변경된 내용으로 새 텍스트 파일을 만듭니다. 그런 다음 이전 텍스트 파일을 삭제하고 새 파일의 이름을 이전 파일 이름으로 바꿀 수 있습니다. 이것은 이를 수행하는 한 가지 방법이며, 물론 다른 방법도 있습니다.

관련 정보