Поиск и замена строки в текстовом файле с помощью Power Shell

#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, поэтому вы уверены, что это код, который вызвал ошибку?