我有一个文件夹,我想搜索所有文件,查找特定字符串,并替换这些字符串。我目前使用以下功能。
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
以及其他一些东西,但我还没有真正了解它。
我会很感激一些意见。 谢谢!
答案 0 :(得分:1)
过滤掉不匹配的文件:
$configFiles = Get-ChildItem $ApplicationFolder\* -include *.xml,*.config,*.bat,*.ini -rec | Where {Select-String $old $_.FullName -Quiet}