通过重新排列文件名批量重命名目录中的文件

时间:2014-01-14 16:43:51

标签: powershell file-rename

我在目录中有大量文件,具有这种命名约定:“[Date] [Lastname] 345.pdf”。注意:345对于所有这些都是常量

我想重命名所有文件,以便他们阅读“[Lastname] [Date] 345.pdf”。

编辑:我最初打错了

我取得了一些成功:

gci -Filter *.pdf| %{Rename-Item $_.fullname $_.Name.Split(" ")[1]}

但这只给了我“[Date] .pdf”。基本上,我无法弄清楚如何使用上面的命令来组合拆分的两个不同部分。我基本上想要“[1] [0] [2] .pdf”,如果这是有道理的。

感谢。

2 个答案:

答案 0 :(得分:1)

使用正则表达式的另一种方法:

Get-ChildItem *.pdf | % {
  $newName = $_.Name -replace '^(.*) (\S+) (\S+\.pdf)$', '$2 $1 $3'
  Rename-Item $_ $newName
}

正则表达式细分:

  • ^(.*)匹配字符串开头的任意数量的字符,并在组中捕获它们。示例文件名[Date]中的[Date] [Lastname] 345.pdf
  • (\S+)匹配一个或多个连续的非空白字符,并在第二组中捕获它们。示例文件名[Lastname]中的[Date] [Lastname] 345.pdf
  • (\S+\.pdf)$匹配一个或多个连续的非空白字符,后跟字符串末尾的字符串.pdf,并捕获第三组中的字符串。示例文件名345.pdf中的[Date] [Lastname] 345.pdf

这些群组由$1$2$3引用,因此替换字符串'$2 $1 $3'会按照您希望的方式对群组进行重新排序。

答案 1 :(得分:0)

给这一点。

gci *.pdf| %{
    $Name = $PSItem.Name.Split(' ');
    $Dest = ('{0} {1} {2}' -f $Name[1], $Name[0], $Name[2]);
    Move-Item $PSItem.FullName -Destination $Dest;
};