我想知道是否可以从整个目录结构中的所有文件中递归地删除 powershell 中的特殊字符?
例如,如果我有一个名为:
my presentation (fix).xlsx
我想将其重命名为:
my presentation fix.xlsx
谢谢你的指导。
我们需要这样做的原因是我们正在将许多文件迁移到 sharepoint 2010 中,而 sharepoint 不喜欢带有特殊字符的文件!
我想知道是否可以从整个目录结构中的所有文件中递归地删除 powershell 中的特殊字符?
例如,如果我有一个名为:
my presentation (fix).xlsx
我想将其重命名为:
my presentation fix.xlsx
谢谢你的指导。
我们需要这样做的原因是我们正在将许多文件迁移到 sharepoint 2010 中,而 sharepoint 不喜欢带有特殊字符的文件!
我没有测试过这段代码,但我想你可能想要类似的东西:
Function Rename-Files($path)
{
Get-ChildItem -path $path |
Foreach-Object {
$newName = $_.name -replace '[^A-Za-z0-9-_ \.\[\]]', ''
if (-not ($_.name -eq $newname)){
Rename-Item -Path $_.fullname -newname ($newName)
}
}
} #end function
Rename-Files -path "C:\somepath"
实际上,只需遍历目录(将函数修改为递归),然后替换任何不适当的(修改正则表达式以获得适当的)字符并将它们替换为空(有效地将它们剥离)。
以下命令将递归遍历您的目录结构匹配,并且对于匹配的每个文件或目录,通过使用 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 中可用。可以尝试尝试这样的事情:
gci * | % {$newname = $_.name -replace '\(|\)|{|}'
if (-not ($_.name -eq $newname)){
rename-item $_.name $newname
}
}
以上将修复文件,如:
我的演示文稿(修复).xlsx
测试 {ddd}.ps1