我想知道是否可以在 powershell 中从整个目录结构中的所有文件递归删除特殊字符?
例如如果我有一个名为的文件:
my presentation (fix).xlsx
我想将其重命名为:
my presentation fix.xlsx
谢谢你的指导。
我们需要这样做的原因是我们正在将许多文件迁移到 SharePoint 2010,而 SharePoint 不喜欢带有特殊字符的文件!
答案1
以下命令将递归遍历您的目录结构匹配,并针对每个匹配的文件或目录,使用 powershell 运算符将每个有问题的字符替换为空字符,对该文件执行重命名-replace
。
请注意,您必须创建一个与要过滤的所有常规字符匹配的正则表达式。为了匹配您提供的示例并删除圆括号,正则表达式将是:
$re = "[()]"
如果要添加方括号,则必须使用反斜杠将其转义:
$re = "[\[\]()]"
只需根据需要在外方括号之间继续添加字符:
$re = "[\[\]()!]"
这是脚本,请注意其中的舞蹈,以便-replace
操作员在每次迭代时仅对名称的基本部分进行操作:
dir -Recurse | ?{$_.Name -match $re} | %{ren -literalpath $_.FullName -newname (join-path (get-item $_.PSPArentPath) $($_.Name -replace $re,""))}
一些说明:
-LiteralPath
命令中的参数需要ren
能够用方括号替换文件:[] 它仅在 Powershell v3 IIRC 中可用。- 重命名后可能会出现名称冲突,此脚本无法处理该问题。