用于查找和替换所有文件的PowerShell脚本

时间:2016-11-03 12:44:54

标签: powershell

我在.cmd文件夹和子文件夹中有很多.ps1C:\Foo个文件,我需要将单词“ vanilla ”替换为“该文件夹和子文件夹中的所有文件中的“巧克力不区分大小写

我就是这样做的:

Get-ChildItem C:\Foo *.cmd *.ps1 -recurse |
    Foreach-Object {
        $c = ($_ | Get-Content) 
        $c = $c -replace 'vanilla','chocolate'
        [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
    }

我只使用[IO.File]::WriteAllText,因为Set-Content在最后添加了新行(虽然我不明白为什么)。

问题是它会打开并写入所有文件,甚至是不包含单词“ vanilla ”的文件,因此会修改所有文件的时间戳。如何改进脚本,使其WriteAllText仅限于replace操作更改过的文件,即包含“ vanilla ”字样的文件?

1 个答案:

答案 0 :(得分:1)

您只需要if语句来检查“香草”是否真的如此。存在于文件中:

Get-ChildItem C:\Foo *.cmd *.ps1 -recurse |
    Foreach-Object {
        $c = ($_ | Get-Content) 
        if(($c -join "").contains("vanilla")){
            $c = $c -replace 'vanilla','chocolate'
            [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
        }
    }