Как правильно экранировать '=' в моем скрипте замены строки?

340
Mr. Mendelli

Я сделал пакетный скрипт, который заменяет строки в указанном текстовом файле. В моем файле строка OutDir=binдолжна быть заменена как, OutDir=Buildно выводится как bin=OutDir=Build=bin. Как избежать =ин 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" 
4
Я предполагаю, что вы уже гуглили это, но прочитайте это и все ответы здесь (https://stackoverflow.com/questions/9556676/batch-file-how-to-replace-equal-signs-and-a-string (переменный), но в частности ответ dbenham и ссылку, которую он предоставляет на DosTips для некоторых дополнительных идей и т. д. Это может быть проще для решения с помощью Batch с помощью небольшого PowerShell, если это то, что вы хотите попробовать - вы должны быть в состоянии поместите PowerShell прямо в пакет и позвольте ему сделать это через PowerShell, но он может быть прозрачным, если вы напишите его правильно, поэтому у вас будет только запущенный пакетный скрипт. Pimp Juice IT 6 лет назад 0
Я не достаточно знаком с PowerShell, чтобы даже _attempt_ его. Это интегрируется с существующим пакетным скриптом, поэтому он должен быть пакетным. Mr. Mendelli 6 лет назад 0
Возможно, но есть еще много чего нужно перевести. Поскольку я так неопытен, это должен был сделать почти кто-то другой. Я также конвертирую скрипт (после его завершения) в двоичный файл exe с помощью Bat To Exe Converter, добавление кода на другом языке, скорее всего, сломает его после конвертации. Mr. Mendelli 6 лет назад 0
Я понимаю все, что вы говорите. Если вы хотите просто попытаться определить, будет ли он работать и даст ли вам желаемый результат, просмотрите текст быстрого пакетного сценария, который вы можете запустить как пакетный, как и любой другой пакетный сценарий: https : //justpaste.it/1f9xv. Пожалуйста, помните, что PowerShell является родным для Windows, а язык на самом деле является просто текстом, поэтому, если exe-преобразование не испортит текст пакета, то здесь не следует делать то же самое. Это должно быть достаточно просто для того, чтобы вы провели небольшой тест, я полагаю, так что в случае, если вы сочтете это полезным, начните. Pimp Juice IT 6 лет назад 1
Дайте мне знать, как это происходит, и если вы найдете что-то полезное или нуждающееся в настройке или подтвердите, что оно может работать после тестирования и т. Д., Пожалуйста, дайте мне знать. Я буду рад добавить ответ с гораздо более подробной информацией, если вы думаете, что это возможно даже в вашей среде. Pimp Juice IT 6 лет назад 1
Большое спасибо! Я проверю это, как только смогу. Я вернусь к вам с результатами, когда мое тестирование будет завершено. Mr. Mendelli 6 лет назад 1
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/71165/discussion-between-mr-mendelli-and-it-snuggles). Mr. Mendelli 6 лет назад 0

1 ответ на вопрос

2
Pimp Juice IT

Замена символа равенства =в строке при помощи пакета PowerShell

После тестирования, а затем исследования, я наткнулся на этот ответ на StackOverflow, который также указал на эту ветку и сообщения на DosTips, и заменить его на =чистый пакет нелегко.

Когда я сталкиваюсь с проблемами с пакетными сценариями, когда требуется тонна сложной пакетной логики или просто не могу понять, как заставить ее работать легко, я обычно пытаюсь включить в микс некоторую PowerShell, поскольку она является родной для Windows и может быть гораздо более надежной. чем партия без сложной логики.

Ниже приведен пакетный скрипт:

  • Используйте Get-Content и Replace для строки для поиска и замены
  • Затем он будет использовать Set-Content, чтобы поместить вновь замененную строку обратно в файл соответственно.

скрипт

@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 

Дополнительные ресурсы