Сценарий PowerShell для Нахождения и заменения для всех Файлов с Определенным Расширением

У меня есть несколько конфигурационных файлов на 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, которые могут предложить некоторое понимание?

113
задан Brandon 14 May 2010 в 21:36
поделиться

3 ответа

Вот первая попытка.

$configFiles = Get-ChildItem . *.config -rec
foreach ($file in $configFiles)
{
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace "Dev", "Demo" } |
    Set-Content $file.PSPath
}
165
ответ дан 24 November 2019 в 02:41
поделиться

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 .

31
ответ дан 24 November 2019 в 02:41
поделиться

Я бы выбрал 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)  
}
10
ответ дан 24 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: