如何使用PowerShell批量重命名文件?
问题描述:
我想用tf rename
,PowerShell和一个正则表达式递归地重命名一堆TFS文件夹,但我在PowerShell中遇到了一些问题,因为我没有花费太多时间。这是我已经把到目前为止更换领导5
与2.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
使其在父文件夹出于某种原因退出)。
答
我将通过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)都将开始花费几分钟。
不知道答案,但一个很好的问题。 :) – 2009-08-12 19:16:26