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

时间:2009-08-12 18:41:37

标签: tfs powershell

我正在尝试使用tf renameTFS和正则表达式递归重命名一堆PowerShell文件夹,但我遇到了PowerShell的一些问题,因为我没有花费很多时间。这是我到目前为止用5取代领先的2.3.2但它无效的原因:

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 }

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

4 个答案:

答案 0 :(得分:14)

我首先按5 *进行过滤,因此您只处理以5开头的名称。此外,在这种情况下,由于tf.exe不是PowerShell cmdlet,因此您不希望使用scriptblock来确定新名称。只需使用这样的分组表达式:

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

顺便说一句,当您尝试调试传递给这样的本机EXE的参数时,使用PowerShell Community Extensions中的echoargs.exe实用程序非常有帮助。这就是它告诉我你原来的方法:

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>

答案 1 :(得分:4)

注意:

  • TFS有native cmdlets - 在大多数情况下不需要tf.exe。
  • 工作空间操作的时间复杂度取决于工作空间中已有的待定重命名的数量。在TFS 2005/2008中,它比线性更糟糕。最重要的是,如果你有大量的项目,你应该考虑将重命名重命名为多个签名,否则每个“tf rename”(或New-TfsPendingChange -Rename,如果使用cmdlet)将开始花费几分钟。

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

运行上述命令要求tf.exe被别名为'tf'..或至少在我的机器上已经别名。

运行此命令:

Set-Alias tf "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\tf.exe"

适当地将路径更新为tf.exe

还可以考虑将该行添加到您的个人资料中,以备将来使用

notepad $PROFILE