我使用下面的PowerShell脚本进行搜索和替换,效果很好。
$files = Get-ChildItem 'E:\replacetest' -Include "*.txt" -Recurse | ? {Test-Path $_.FullName -PathType Leaf}
foreach($file in $files)
{
$content = Get-Content $file.FullName | Out-String
$content| Foreach-Object{$_ -replace 'hello' , 'hellonew'`
-replace 'hola' , 'hellonew' } | Out-File $file.FullName -Encoding utf8
}
问题是脚本还会修改其中没有匹配文本的文件。我们如何忽略没有匹配文本的文件?
答案 0 :(得分:2)
您可以使用匹配来查看内容是否实际更改。由于您总是使用out-file编写文件,因此将修改该文件。
$files = Get-ChildItem 'E:\replacetest' -Include "*.txt" -Recurse | Where-Object {Test-Path $_.FullName -PathType Leaf}
foreach( $file in $files ) {
$content = Get-Content $file.FullName | Out-String
if ( $content -match ' hello | hola ' ) {
$content -replace ' hello ' , ' hellonew ' `
-replace ' hola ' , ' hellonew ' | Out-File $file.FullName -Encoding utf8
Write-Host "Replaced text in file $($file.FullName)"
}
}
答案 1 :(得分:1)
您已经获得了额外的foreach
,并且需要if
声明:
$files = Get-ChildItem 'E:\replacetest' -Include "*.txt" -Recurse | ? {Test-Path $_.FullName -PathType Leaf}
foreach($file in $files)
{
$content = Get-Content $file.FullName | Out-String
if ($content -match 'hello' -or $content -match 'hola') {
$content -replace 'hello' , 'hellonew'`
-replace 'hola' , 'hellonew' | Out-File $file.FullName -Encoding utf8
}
}