我在.cmd
文件夹和子文件夹中有很多.ps1
和C:\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 ”字样的文件?
答案 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"))
}
}