如何将带有特殊字符的文件名转换为有效的文件名?

时间:2013-04-03 21:00:35

标签: file sharepoint powershell recursion filenames

我想知道是否可以从整个目录结构中的所有文件中在powershell中递归删除特殊字符?

例如,如果我有一个名为:

的文件
my presentation (fix).xlsx

我想将其重命名为:

my presentation fix.xlsx

感谢您的指导。

我们需要这样做的原因是我们正在将许多文件迁移到sharepoint 2010中,而sharepoint不喜欢具有特殊字符的文件!

3 个答案:

答案 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