Я сделал пакетный скрипт, который заменяет строки в указанном текстовом файле. В моем файле строка 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и заменить его =
чистой партией нелегко.
Когда я сталкиваюсь с проблемами пакетного скриптинга, когда требуется сложная пакетная логика, или просто не могу понять, как заставить ее работать легко, я обычно пытаюсь включить некоторыеPowerShellв микс, так как этоОкнанативный и может быть гораздо более надежным, чем пакетный без сложной логики.
Пакетный скрипт ниже по сути выполняет следующие действия:
- ИспользоватьПолучить-КонтентиЗаменятьдля строки для поиска и замены
- Затем он будет использоватьНабор-Контентчтобы поместить вновь замененную строку обратно в файл соответствующим образом
Сценарий
@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
Вышеприведенный код проходит по строкам в текстовом файле, выполняет замену и создает новый текстовый файл с внесенными изменениями. Затем вы можете удалить старый текстовый файл и переименовать новый файл в имя старого файла. Это один из способов сделать это, конечно, есть и другие.