Powershell如果更改了Set-Content

时间:2014-07-02 19:05:49

标签: powershell if-statement foreach timestamp

我有一个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语句。非常感谢您如何做到最好。

1 个答案:

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