如何使用PowerShell批量重命名文件?

问题描述:

我想用tf rename,PowerShell和一个正则表达式递归地重命名一堆TFS文件夹,但我在PowerShell中遇到了一些问题,因为我没有花费太多时间。这是我已经把到目前为止更换领导52.3.2,但它不工作:如何使用PowerShell批量重命名文件?

dir | foreach { tf rename $_ { $_.Name -replace '^5', '2.3.2' } } 

实际结果:

 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
...etc. 

更新:

我得到了一个代之以下更近一步:

dir | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname } 

我的下一个目标是使这个递归子目录,但这似乎有点更具挑战性(将其更改为dir -recurse使其在父文件夹出于某种原因退出)。

+0

不知道答案,但一个很好的问题。 :) – 2009-08-12 19:16:26

我将通过5第一过滤器*,所以你只与5同样开始,在这种情况下,由于tf.exe不是PowerShell命令进程名,你不”我想用scriptblock来确定一个新的名字。只需使用一个分组表达式,像这样:

dir -filter 5* | foreach { tf rename $_ ($_.Name -replace '^5', '2.3.2')} 

顺便说一句,当你试图传递给本地EXE这样的调试参数,它是非常有帮助的使用echoargs.exe utilty从PowerShell Community Extensions。这是它告诉我你原来的做法:

6# dir -filter 5* | foreach { echoargs rename $_ { $_.Name -replace '^5', '2.3.2' } } 
Arg 0 is <rename> 
Arg 1 is <5foo.txt> 
Arg 2 is <-encodedCommand> 
Arg 3 is <IAAkAF8ALgBOAGEAbQBlACAALQByAGUAcABsAGEAYwBlACAAJwBeADUAJwAsACAAJwAyAC4AMwAuADIAJwAgAA==> 
Arg 4 is <-inputFormat> 
Arg 5 is <xml> 
Arg 6 is <-outputFormat> 
Arg 7 is <text> 
+0

谢谢!优秀的答案。 – Luke 2009-08-13 19:47:53

试试这个:

dir . | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname } 

注:

  • TFS有native cmdlets - 无需在大多数情况下tf.exe。
  • 工作区操作的时间复杂度取决于工作区中已有的未决重命名的数量。在TFS 2005/2008中,它明显比线性更差。底线,如果您有大量项目,您应该真的考虑批量重命名为多个checkins,否则每个“tf重命名”(或使用cmdlet的New-TfsPendingChange -Rename)都将开始花费几分钟。