2009-08-12 23 views
10

Sto tentando di rinominare in modo ricorsivo un gruppo di cartelle TFS utilizzando tf rename, PowerShell e un'espressione regolare, ma sto avendo alcuni problemi con PowerShell poiché non ho trascorso molto tempo con esso. Questo è quello che ho messo insieme finora per sostituire un leader 5 con 2.3.2 ma non funziona:Come posso rinominare in massa i file usando PowerShell?

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

Risultato effettivo:

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

Aggiornamento:

ho ottenuto un un po 'più vicino, invece:

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

Il mio prossimo obiettivo è per rendere questa sottodirectory recurse, ma questo sembra un po 'più impegnativo (cambiandolo a dir -recurse si esce dopo le cartelle principali per qualche motivo).

+0

Non so la risposta, ma una buona domanda. :) –

risposta

14

avrei primo filtro da 5 * in modo che solo i nomi dei processi che iniziano con 5. Inoltre, in questo caso, poiché tf.exe non è un cmdlet di PowerShell, è don' t voglio usare un scriptblock per determinare un nuovo nome. Basta usare un'espressione di raggruppamento in questo modo:

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

A proposito, quando si sta cercando di eseguire il debug parametro che passa a un EXE nativo come questo è estremamente utile per utilizzare l'utilty echoargs.exe dal PowerShell Community Extensions. Questo è ciò che mi ha raccontato il suo approccio originale:

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

Grazie! Ottima risposta – Luke

1

Prova questo:

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

Note:

  • TFS ha native cmdlets - senza bisogno di tf.exe nella maggior parte dei casi.
  • La complessità temporale delle operazioni dello spazio di lavoro dipende dal numero di nomi in sospeso già presenti nell'area di lavoro. In TFS 2005/2008 è significativamente peggio di lineare. In conclusione, dovresti prendere in considerazione la possibilità di ridenominare le ridenominazioni in più check-in se hai un numero maggiore di articoli, altrimenti ogni singolo "tf rinominare" (o New-TfsPendingChange -Rename se si usano i cmdlet) inizierà a richiedere dei minuti.