1

Мне нужно использовать PowerShell 5.1, чтобы прочитать файл, внести в него изменения и записать результаты в другой файл. Я изучал https://stackoverflow.com/questions/45540444/grep-and-sed-not-working-in-powershell и смог адаптировать информацию там к чему-то близкому к тому, что я хочу, что в настоящее время следующие:

PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' | Out-File -filepath output_file"

Это работает, но у меня есть две проблемы, на которые я еще не нашел ответ:

  1. Поскольку приведенная выше инструкция является частью рецепта в Makefile, который должен использовать cmd.exe в качестве оболочки (в противном случае я бы просто использовал sed), мне нужно сформулировать инструкцию как есть, то есть с фактической командой PowerShell, передаваемой как символьная строка между двумя двойными кавычками. Использование одинарных кавычек вокруг значений аргументов -replace работает, но в реальной задаче мне нужно передать переменные, поэтому я должен использовать двойные кавычки, чтобы ссылки на переменные могли быть расширены. В другом месте я читал, что для включения двойных кавычек в инструкцию powershell нужно просто использовать две двойные кавычки подряд, но когда я это делаю, я получаю сообщение об ошибке, в котором я должен использовать выражение значения после оператора -replace .

Вот версия, которая не работает:

PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace ""AAA"",""BBB"" | Out-File -filepath output_file"

Итак, мой первый вопрос: как я могу включить имя переменной в выражение значения таким образом, чтобы оно могло быть расширено до его реального значения?

Мой второй вопрос, мне нужно сделать более одного редактирования файла. Поскольку оператор -replace похоже, связан с командлетом Get-Content, я попробовал следующее:

PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' -replace 'CCC','DDD' | Out-File -filepath output_file"

Присутствие выражения второго -replace вызвало исключение ошибки. Поэтому, если мне нужно на лету внести несколько изменений в исходный файл, прежде чем окончательная версия будет записана обратно в файловую систему, есть ли простой способ сделать это, кроме повторной отправки всего файла через новый канал Get-Content для каждое редактирование?

Спасибо.

1 ответ1

1

Это поможет увидеть ошибку, которую вы получите.

Здесь это работает с двумя заменами в окне cmd.

В качестве альтернативы вы можете попробовать метод .replace('AAA','BBB') .

> type test.txt
blah AAA
Blubb CCC

> PowerShell -ExecutionPolicy Bypass -C "(Get-Content .\test.txt -Raw) -replace 'AAA','BBB' -replace 'CCC','DDD' "

blah BBB
Blubb DDD

> PowerShell -ExecutionPolicy Bypass -C "(Get-Content .\test.txt -Raw).replace('AAA','BBB').replace('CCC','DDD')"
blah BBB
Blubb DDD

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .