2009-08-12 14 views
10

Estoy intentando recursivamente cambiar el nombre de un montón de carpetas TFS usando tf rename, PowerShell y una expresión regular, pero tengo algunos problemas con PowerShell ya que no he pasado mucho tiempo con él. Esto es lo que he reunido hasta el momento para sustituir a un líder 5 con 2.3.2 pero no está funcionando:¿Cómo puedo cambiar el nombre de los archivos usando PowerShell?

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

Resultado real:

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

Actualización:

Tengo una un poco más cerca haciendo lo siguiente en su lugar:

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

Mi próximo objetivo es para hacer esto recurrentemente subdirectorios pero esto parece un poco más desafiante (cambiarlo a dir -recurse lo hace salir después de las carpetas padre por alguna razón).

+0

No sé la respuesta, pero es una buena pregunta. :) –

Respuesta

14

Me primer filtro en un 5 * por lo que sólo los nombres de procesos que comienzan con 5. Además, en este caso desde tf.exe no es un cmdlet de PowerShell, don' Quiero usar un scriptblock para determinar un nuevo nombre. Sólo tiene que utilizar una expresión de la agrupación, así:

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

Por cierto, cuando se está tratando a los parámetros de depuración de pasar a un EXE nativo como esto es inmensamente útil para utilizar el utilty echoargs.exe del PowerShell Community Extensions. Esto es lo que me contó acerca de su enfoque original:

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

¡Gracias! Excelente respuesta – Luke

1

Prueba esto:

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

Notas:

  • TFS tiene native cmdlets - sin necesidad de tf.exe en la mayoría de los casos.
  • La complejidad del tiempo de las operaciones del área de trabajo depende de la cantidad de redenombres pendientes que ya se encuentran en el área de trabajo. En TFS 2005/2008 es significativamente peor que lineal. En pocas palabras, realmente debería considerar cambiar el nombre de los nuevos en múltiples registros si tiene un gran número de elementos, de lo contrario, cada "tf rename" (o New-TfsPendingChange -Rename si usa los cmdlets) comenzará a tomar minutos.
Cuestiones relacionadas