3

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

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

my presentation (fix).xlsx

我想将其重命名为:

my presentation fix.xlsx

谢谢你的指导。

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

4

3 回答 3

6

我没有测试过这段代码,但我想你可能想要类似的东西:

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"

实际上,只需遍历目录(将函数修改为递归),然后替换任何不适当的(修改正则表达式以获得适当的)字符并将它们替换为空(有效地将它们剥离)

于 2013-04-03T21:11:23.883 回答
2

以下命令将递归遍历您的目录结构匹配,并且对于匹配的每个文件或目录,通过使用 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 中可用。
  • 重命名后您可能会遇到名称冲突,此脚本无法处理。
于 2013-04-03T22:29:34.723 回答
1

可以尝试尝试这样的事情:

gci * | % {$newname = $_.name -replace '\(|\)|{|}'  
           if (-not ($_.name -eq $newname)){
               rename-item $_.name $newname
           }
          }

以上将修复文件,如:

我的演示文稿(修复).xlsx

测试 {ddd}.ps1

于 2013-04-03T21:14:24.627 回答