У меня есть несколько конфигурационных файлов на Windows Server 2008, вложенном как такой:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
В моей конфигурации я должен сделать строковую замену как такой:
<add key="Environment" value="Dev"/>
станет:
<add key="Environment" value="Demo"/>
Я думал об использовании пакетных сценариев, но не было никакого хорошего способа сделать это, и я слышал, что с PowerShell, пишущим сценарий Вас, может легко выполнить это. Я нашел, что примеры находят/заменяют, но я надеялся на путь, который пересечет все папки в рамках моего каталога C:\Projects и найдет любые файлы, которые заканчивают '.config' расширение. Когда это находит один, я хочу, чтобы это заменило мои строковые значения.
Какие-либо хорошие ресурсы, чтобы узнать, как сделать это или каких-либо гуру PowerShell, которые могут предложить некоторое понимание?
Вот первая попытка.
$configFiles = Get-ChildItem . *.config -rec
foreach ($file in $configFiles)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace "Dev", "Demo" } |
Set-Content $file.PSPath
}
PowerShell - хороший выбор;) Это очень легко перечислить файлы в заданном каталоге, прочитать их и обработать.
Скрипт может выглядеть так:
Get-ChildItem C:\Projects *.config -recurse |
Foreach-Object {
$c = ($_ | Get-Content)
$c = $c -replace '<add key="Environment" value="Dev"/>','<add key="Environment" value="Demo"/>'
[IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}
Я разбил код на несколько строк, чтобы вы могли их прочитать.
Обратите внимание, что вы можете использовать Set-Content вместо [IO.File]: : WriteAllText
, но добавляет новую строку в конец. С помощью WriteAllText
вы можете этого избежать.
В противном случае код мог бы выглядеть так: $ c | Set-Content $ _. FullName
.
Я бы выбрал xml и xpath:
dir C:\Projects\project_*\project*.config -recurse | foreach-object{
$wc = [xml](Get-Content $_.fullname)
$wc.SelectNodes("//add[@key='Environment'][@value='Dev']") | Foreach-Object {$_.value = 'Demo'}
$wc.Save($_.fullname)
}