2014-01-14 154 views
0

我在具有此类命名约定的目录中有大量文件:“[Date] [Lastname] 345.pdf”。注意:345对于所有这些文件都是恒定的批量通过重新排列文件名重命名目录中的文件

我想重命名所有文件,以便它们读取“[姓氏] [日期] 345.pdf”。

编辑:我在那里开始

有一个错字我已经取得了一些成功:

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

但这只不过是给了我 “[日期] .PDF”。基本上,我不知道如何使用上述命令来组合分割的两个不同部分。我基本上想要“[1] [0] [2] .pdf”,如果这是有道理的。

谢谢。

回答

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'重新排序组你想要的方式。

+0

这工作!谢谢。你能解释一下这里发生了什么吗?仍在努力学习。 – user3194848

+0

@ user3194848查看已更新的答案。 –

+1

@ user3194848顺便说一句,这个问题是不明确的......开始的例子意味着你想用** 302 **替换** 345 **,但是你最后说的话意味着你想保持相同数字(这是这个答案中的正则表达式)。是** 302 **错字?如果你确实想改变数字,把替换改为'$ _。Name -replace'^(。*)(\ S +)([^。] +)','$ 2 $ 1 302''。 –

0

给这个镜头。

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

这一个没有工作。在split运算符上出现错误“您无法在空值表达式上调用方法”。 – user3194848

+0

您使用的是什么版本的PowerShell? “$ PSItem”是PowerShell 3.0版本中的新增功能,因此如果您运行的是PowerShell 2.0版,那么您将不得不使用'$ _'而不是'$ PSItem'。 –