Мне нужно использовать 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"
Это работает, но у меня есть две проблемы, на которые я еще не нашел ответ:
- Поскольку приведенная выше инструкция является частью рецепта в 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 для каждое редактирование?
Спасибо.