Eu preciso usar o PowerShell 5.1 para ler um arquivo, editá-lo e gravar os resultados em outro arquivo. Estive estudando link e consegui adaptar as informações lá para algo perto do que eu quero, que atualmente é o seguinte:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' | Out-File -filepath output_file"
Isso funciona, mas tenho dois problemas para os quais ainda não encontrei uma resposta:
- Como a instrução acima é parte de uma receita em um Makefile que deve usar o cmd.exe como seu shell (senão usaria o sed), preciso colocar a instrução como está, ou seja, com o comando PowerShell real sendo passado como uma cadeia de caracteres entre duas aspas duplas. Usar aspas simples ao redor dos valores dos argumentos -replace funciona, mas no problema da vida real eu preciso passar variáveis, então eu tenho que usar aspas duplas para que as referências das variáveis possam ser expandidas. Eu li em outro lugar que para incluir uma aspas duplas em uma instrução powershell apenas para usar duas aspas em uma linha, mas quando eu faço isso recebo uma mensagem de erro que devo usar uma expressão de valor após o operador
-replace
.
Aqui está a versão que não funciona:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace ""AAA"",""BBB"" | Out-File -filepath output_file"
Então, minha primeira pergunta é: como posso incluir um nome de variável na expressão de valor de uma maneira que permita que ele seja expandido para seu valor real?
Minha segunda pergunta é que preciso fazer mais de uma edição no arquivo. Como o operador -replace
parece estar ligado ao comando Get-Content, tentei o seguinte:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' -replace 'CCC','DDD' | Out-File -filepath output_file"
A presença da segunda expressão -replace
gerou uma exceção de erro. Então, se eu precisar fazer várias edições no arquivo de origem rapidamente antes que a versão final seja gravada no sistema de arquivos, existe uma maneira simples de fazê-lo, além de enviar o arquivo inteiro por meio de um novo canal Get-Content novamente para toda edição?
Obrigado.