#powershell
#powershell
Вопрос:
У меня есть файл bat (скажем, test.bat), который содержит некоторые назначения переменных, такие как:
set SFT_HOME=C:Software1
set SFT_ERRO_DIR=C:Software1Err
Мне нужно написать сценарий Powershell для замены этих значений переменных в test.bat на что-то вроде : replace 'set SFT_HOME=C:Software1' with 'set SFT_HOME=C:Software1Check'
replace 'set SFT_ERRO_DIR=C:Software1Err' with 'set SFT_ERRO_DIR=C:Software1ErrCheck'
Я пробовал следующее, но не сработало:
(Get-Content -path C:programsoftwaretest.bat) -replace 'set SFT_HOME=C:Software1', 'set SFT_HOME=C:Software1Check' | Set-Content C:programsoftwaretest.bat"
Выдает недопустимую ошибку шаблона регулярного выражения
Ответ №1:
В регулярном выражении есть специальные символы, которые необходимо экранировать, в частности, обратную косую черту. Чтобы избежать их, вы используете обратную косую черту — это будет выглядеть так
'set SFT_HOME=C:Software1' -replace 'set SFT_HOME=C:\Software1','set SFT_HOME=C:Software1Check'
Однако, чтобы избежать экранирования вручную, вы можете просто использовать метод regex escape().
'set SFT_HOME=C:Software1' -replace [regex]::escape('set SFT_HOME=C:Software1'),'set SFT_HOME=C:Software1Check'
Комментарии:
1. Большое спасибо.. Это действительно работает, когда я запускаю команду из командной строки powershell… однако, когда я пытаюсь вызвать их из пакетного сценария путем записи
Powershell command "(Get-Content -path C:Software1test.bat) -replace [regex]::escape('set SFT_HOME=C:Software1'), 'set SFT_HOME=C:Software1Check' | Set-Content C:Software1test.bat"
, это выдает мне ошибку Get-Command : не удается проверить аргумент для параметра ‘Name’.2. Я не вижу Get-Command, поэтому вы уверены, что это код, который вызвал ошибку?