在Windows中replace子文件夹中的所有文件名

将大约200,000个文件迁移到OneDrive上,发现有几个字符是他们不喜欢的 – 最大的违规者是# 。 我有一个散列约3000个文件,我想用全部replace它们。 例如,old: File#3.txt new: File No.3.txt

我尝试使用PowerShell脚本,但它不喜欢#

 Get-ChildItem -Filter "*#*" -Recurse | Rename-Item -NewName { $_.name -replace '#',' No. ' } 

我没有太多的运气搞清楚保留字符的语法 – 我试过\##\'*#*' ,没有运气。

任何人都可以阐明这一点或提供一个快速的方法来recursionreplace所有这些散列标签?

谢谢。

 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 30.10.2014 14:58 0 file#1.txt -a--- 30.10.2014 14:58 0 file#2.txt 

PowerShell使用反引号(`)作为转义字符,并使用双引号来评估内容:

 Get-ChildItem -Filter "*`#*" -Recurse | Rename-Item -NewName {$_.name -replace '#','No.' } -Verbose 

要么

 Get-ChildItem -Filter "*$([char]35)*" -Recurse | Rename-Item -NewName {$_.name -replace "$([char]35)","No." } -Verbose 

两者都会工作。

 Get-ChildItem -Filter "*`#*" -Recurse | Rename-Item -NewName {$_.name -replace "`#","No." } -Verbose VERBOSE: Performing the operation "Rename File" on target "Item: D:\tmp\file#1.txt Destination: D:\tmp\fileNo.1.txt". VERBOSE: Performing the operation "Rename File" on target "Item: D:\tmp\file#2.txt Destination: D:\tmp\fileNo.2.txt". 

这也可以,

 Get-ChildItem -Filter '*#*' -Recurse | Rename-Item -NewName {$_.name -replace '#', 'No.'} -Verbose VERBOSE: Performing the operation "Rename File" on target "Item: D:\tmp\file#1.txt Destination: D:\tmp\fileNo.1.txt". VERBOSE: Performing the operation "Rename File" on target "Item: D:\tmp\file#2.txt Destination: D:\tmp\fileNo.2.txt". 

因为PowerShell解析器足够聪明,可以明确你的意图。