我想知道是否可以从整个目录结构中的所有文件中在powershell中递归删除特殊字符?
例如,如果我有一个名为:
的文件my presentation (fix).xlsx
我想将其重命名为:
my presentation fix.xlsx
感谢您的指导。
我们需要这样做的原因是我们正在将许多文件迁移到sharepoint 2010中,而sharepoint不喜欢具有特殊字符的文件!
答案 0 :(得分:4)
我没有测试过这段代码,但我想你可能想要类似的东西:
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"
有效地,只需遍历目录(修改函数是递归的)然后替换任何不适当的(修改正则表达式为appropo)字符并替换它们什么都没有(有效地剥离它们)。
答案 1 :(得分:2)
以下命令将以递归方式遍历您的目录结构匹配,并且对于匹配的每个文件或目录,通过使用powershell -replace
运算符将每个有问题的字符替换为空字符来对该文件执行重命名。 / p>
请注意,您必须创建一个匹配所有要过滤的常规字符的正则表达式。要匹配您提供的示例并删除圆括号,正则表达式将为:
$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中可用。答案 2 :(得分:1)
可以尝试尝试这样的事情:
gci * | % {$newname = $_.name -replace '\(|\)|{|}'
if (-not ($_.name -eq $newname)){
rename-item $_.name $newname
}
}
上面会修复如下文件:
我的演讲(修复).xlsx
测试{ddd} .ps1