我有一个PowerShell脚本,用于更改许多文件中的文本。以下脚本将起作用&按预期更改文本。
Get-ChildItem $FileFolder -Recurse |
select -ExpandProperty fullname |
foreach {
(Get-Content $_) |
ForEach-Object {$_ -replace $old $new } |
Set-Content $_
}
问题是,它会更改它打开的每个文件,因此即使没有更改任何内容,所有内容都有一个运行作业的时间戳。
我尝试过类似here的内容,但它给了我一个错误:
The term 'if' is not recognized as the name of a cmdlet, function, etc...
以下是我尝试运行的代码:
Get-ChildItem $FileFolder -Recurse |
select -ExpandProperty fullname |
foreach {
$b = ($a = Get-Content $_) |
ForEach-Object {$_ -replace $old $new } |
if (Compare $a $b -PassThru) {
$b | Set-Content $_
}
}
我知道代码不对,但如果我将其移到ForEach-Object
内,它也不会运行。
我想要做的是仅在文件内容发生变化时才使用Set-Content
语句。非常感谢您如何做到最好。
答案 0 :(得分:3)
您可以做的是在获取和设置内容之前查找字符串。类似的东西:
Get-ChildItem $FileFolder -Recurse |
select -ExpandProperty fullname |
foreach {
If(Select-String -Path $_ -SimpleMatch $old -quiet){
(Get-Content $_) |
ForEach-Object {$_ -replace $old $new } |
Set-Content $_
}
}