查找并替换多个文件中的字符串

时间:2014-08-21 14:23:09

标签: powershell replace

我有一个文件夹,我想搜索所有文件,查找特定字符串,并替换这些字符串。我目前使用以下功能。

Function replacement($old, $new, $location){
$configFiles = Get-ChildItem $ApplicationFolder\* -include *.xml,*.config,*.bat,*.ini -rec 

foreach ($file in $configFiles){
        Try {
            (Get-Content $file.pspath) | ForEach-Object {$_ -replace $old, $new} | Set-Content $file.pspath
        }
        Catch {
        $tempfile = Convert-Path -path $file.PSPath
        $message = "`nCould not replace $old in " + $tempfile +". This is usually caused by a permissions issue. The string may or may not exist."
        $message
        }
}
}

遗憾的是,此函数会读取和写入文件夹中的所有文件 - 而不仅仅是包含字符串的文件。

我正在尝试使脚本更有效率,并使用下面的行来减少权限错误。

Function replacement($old, $new, $location){
Get-ChildItem $location -include *.xml,*.config,*.bat,*.ini -rec | Select-String -pattern     $old | Get-Content $_.path | ForEach-Object {$_ -replace $old, $new} | Set-Content $_.path
}

我遇到的问题是将Select-String用于Get-Content。它传递的对象无法有效地表示文件对象。

我已经尝试将Select-String连接到Format-Table -Property path -force -HideTableHeaders以及其他一些东西,但我还没有真正了解它。

我会很感激一些意见。 谢谢!

1 个答案:

答案 0 :(得分:1)

过滤掉不匹配的文件:

$configFiles = Get-ChildItem $ApplicationFolder\* -include *.xml,*.config,*.bat,*.ini -rec | Where {Select-String $old $_.FullName -Quiet}