Eu tenho vários arquivos de configuração no Windows Server 2008 aninhados como estes:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
Na minha configuração, eu preciso substituir uma string como esta:
<add key="Environment" value="Dev"/>
se tornará:
<add key="Environment" value="Demo"/>
Pensei em usar scripts em lote, mas não havia uma boa maneira de fazer isso, e ouvi dizer que, com os scripts do PowerShell, você pode fazer isso facilmente. Encontrei exemplos de localização / substituição, mas esperava uma maneira de atravessar todas as pastas dentro do diretório C: \ Projects e encontrar quaisquer arquivos que terminassem com a extensão '.config'. Quando encontrar um, quero que ele substitua meus valores de string.
Existem bons recursos para descobrir como fazer isso ou quaisquer gurus do PowerShell que possam oferecer algumas dicas?
powershell
scripting
replace
find
Brandon
fonte
fonte
Respostas:
Aqui está uma primeira tentativa no topo da minha cabeça.
fonte
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
depois dols
. Eu fui picado por isso.O PowerShell é uma boa opção;) É muito fácil enumerar arquivos em um determinado diretório, lê-los e processá-los.
O script pode ficar assim:
Dividi o código em mais linhas para ser legível para você. Observe que você pode usar Set-Content em vez de
[IO.File]::WriteAllText
, mas ele adiciona uma nova linha no final. ComWriteAllText
você pode evitá-lo.Caso contrário, o código poderia ser assim:
$c | Set-Content $_.FullName
.fonte
Essa abordagem funciona bem:
fonte
Get-Content $_
porGet-Content $_.FullName
, e o equivalenteSet-Content
, para lidar com arquivos que não estavam na raiz.Eu iria com xml e xpath:
fonte
Este exemplo do PowerShell procura todas as instâncias da string "\ foo \" em uma pasta e suas subpastas, substitui "\ foo \" por "\ bar \" E NÃO REWRITE arquivos que não contêm a string "\ foo \ "Desta forma, você não destrói os carimbos de data / hora da última atualização do arquivo em que a cadeia não foi encontrada:
fonte
Eu achei útil o comentário de @Artyom, mas infelizmente ele não postou uma resposta.
Esta é a versão curta, na minha opinião, a melhor versão, da resposta aceita;
fonte
foreach-object
vez do%
alias ao executar um comando como este. Caso contrário, pode resultar no erro:Expressions are only allowed as the first element of a pipeline
Eu escrevi uma pequena função auxiliar para substituir o texto em um arquivo:
Exemplo:
fonte
Ao fazer a substituição recursiva, o caminho e o nome do arquivo precisam ser incluídos:
Isso substituirá todos os "antigos" por "novos" que diferenciam maiúsculas de minúsculas em todos os arquivos das suas pastas do diretório atual.
fonte