У меня есть несколько файлов конфигурации на 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, которые могут предложить некоторые идеи?
powershell
scripting
replace
find
Brandon
источник
источник
Ответы:
Вот первая попытка в моей голове.
источник
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
послеls
. Меня это ужалило.PowerShell - хороший выбор;) Очень легко перечислить файлы в заданном каталоге, прочитать их и обработать.
Скрипт мог выглядеть так:
Я разбил код на несколько строк, чтобы вы могли их прочитать. Обратите внимание, что вы можете использовать Set-Content вместо
[IO.File]::WriteAllText
, но он добавляет новую строку в конце. С нимWriteAllText
можно этого избежать.В противном случае код может выглядеть следующим образом :
$c | Set-Content $_.FullName
.источник
Этот подход хорошо работает:
источник
Get-Content $_
наGet-Content $_.FullName
и эквивалентSet-Content
для обработки файлов, которые не были в корне.Я бы пошел с xml и xpath:
источник
Этот пример PowerShell ищет все экземпляры строки «\ foo \» в папке и ее подпапках, заменяет «\ foo \» на «\ bar \» И НЕ ПЕРЕПИСЫВАЕТ файлы, которые не содержат строку «\ foo \» "Таким образом вы не уничтожите отметки даты и времени последнего обновления файла, где строка не была найдена:
источник
Я нашел комментарий @Artyom полезным, но, к сожалению, он не опубликовал ответа.
Это краткая, на мой взгляд, лучшая версия принятого ответа;
источник
foreach-object
вместо%
псевдонима при выполнении такой команды. В противном случае это может привести к ошибке:Expressions are only allowed as the first element of a pipeline
Я написал небольшую вспомогательную функцию для замены текста в файле:
Пример:
источник
При рекурсивной замене необходимо указать путь и имя файла:
Это заменит все «старые» на «новые» с учетом регистра во всех файлах ваших папок текущего каталога.
источник