2016-07-19 97 views
0

我使用下面的PowerShell腳本,以搜索和替換工作正常搜索和使用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

是否有任何選項可以忽略一些匹配的文本。例如,該文件也由文件路徑組成,如c:/hola/hello.xml。我想包含一個正則表達式或條件,以便在/ hola /之間不更改hola,或者將其作爲文件名作爲hello.xml並更改其他的參數。 – user2628187

回答

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  
    } 
} 
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)" 
    }  
} 
+0

是否可以輸出腳本正在修改的文件? – user2628187

+0

是的。我會更新它 –

+0

非常感謝... – user2628187