2009-08-12 83 views
10

我想用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

回答

14

我將通過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

1

試試這個:

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

注:

  • TFS有native cmdlets - 無需在大多數情況下tf.exe。
  • 工作區操作的時間複雜度取決於工作區中已有的未決重命名的數量。在TFS 2005/2008中,它明顯比線性更差。底線,如果您有大量項目,您應該真的考慮批量重命名爲多個checkins,否則每個「tf重命名」(或使用cmdlet的New-TfsPendingChange -Rename)都將開始花費幾分鐘。