我正在尝试创建一个Power Shell脚本,该脚本将所有文件夹和子文件夹文件中的一个字符串替换为另一个字符串,以打印该脚本通过的所有路径。所以我写了Bash命令,但是不能将其转换为Powershell命令
这是正确执行工作的bash命令
find ./ -print -type f -exec sed -i 's/string1/string2/g' {} \;
我找到的最接近的是
ls * -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "string1", "string2" } | sc $f.PSPath }
但是看起来并没有完成同样的工作,加上它没有打印路径
答案 0 :(得分:1)
您不需要多个ForEach-Object
循环。不过,要实现-type f
,您需要过滤文件。在PowerShell v3和更高版本中,您可以使用参数-File
来实现。在早期版本中,您必须向管道添加Where-Object {$_.PSIsContainer}
。
这样的事情应该做你想要的:
Get-ChildItem -Recurse -File | ForEach-Object {
(Get-Content $_.FullName) -replace 'string1', 'string2' |
Set-Content $_.FullName
$_.FullName
}
或(简称):
ls -r -File | %{(gc $_.FullName) -replace 'string1', 'string2' | sc $_.FullName; $_.FullName}
请注意,Set-Content
会自动以ASCII编码保存文件(从技术上讲,这是ANSI编码,但是请忽略这点,因为Microsoft习惯上还是使用这两个术语作为同义词),因此您可能需要如果不需要,请指定其他编码。
还请注意,如果您有非文本文件,则可能希望将它们排除在处理之外,因为Get-Content
和Set-Content
在读取/写入二进制文件所不希望的文件时会做特定的事情({没有参数Get-Content
或-Raw
的{1}}在换行符处拆分输入,-Encoding Byte
在每个输入字符串的末尾附加一个换行符(CR-LF),然后再将它们写入输出文件)。