使用PowerShell进行搜索和替换

时间:2016-07-19 19:02:02

标签: powershell powershell-v2.0

我使用下面的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
}

问题是脚本还会修改其中没有匹配文本的文件。我们如何忽略没有匹配文本的文件?

2 个答案:

答案 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    
  }
}