2011-12-30 5 views
9

Estoy tratando de copiar recursivamente los archivos y cambiarles el nombre.Renombrarlo después de copiarlo con powershell

Mis carpetas tiene un archivo con el mismo nombre, así que necesito cambiarle el nombre en el momento en que se copia.

Pero sigo teniendo problemas. El siguiente es mi código. Debería encontrar el archivo CopyForBuild.bat y copiarlo en la carpeta E: \ CopyForBuild. Una vez copiado, el primer archivo debe ser Copyforbuild1.txt, el segundo será CopyforBuild2.txt y así sucesivamente.

El siguiente es mi código. ¿Dónde estoy fallando?

$File = Get-ChildItem -Path V:\MyFolder -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 

    Copy-Item $f "E:\copyforbuild\" 
    Rename-Item -path "E:\Copyforbuild\"+"$f" -newname "CopyForbuild"+"$i"+".txt" 
    $i = $i+1 
} 

Respuesta

14

Puede cambiar el nombre de archivos mientras copia en Copy-Item, simplemente proporcionar ruta completa en ambos lugares:

copy-item c:\PST\1.config c:\PST\2.config 

Esto cambiará el nombre 1.config a 2.config. No es necesario llamar a la función de cambio de nombre por separado. Su código debe ser algo como esto:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 
    Copy-Item $f.FullName ("E:\copyforbuild\" + $f.BaseName + $i +".txt") 
    $i++ 
} 

Usted puede hacer que sea aún más corto si el uso del bucle For:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

for($i = 0; $i -lt $File.Count; $i++) 
{ 
    Copy-Item $File[$i].FullName ("E:\copyforbuild\" + $File[$i].BaseName + $i +".txt") 
} 

O camino más corto y más ancho si seguir el comentario de Richard

+4

¿Por qué no en el proceso todo de a uno por vez (y recuerde que las variables obtienen valores predeterminados): 'Get-ChildItem -Path V: \ MyFolder -filt CoptForBuild.bat -rec | Copy-Item -dest {"E: \ copyforbuild \" + $ _. BaseName + ($ i ++) + ". Txt"} '. (Los cmdlets con parámetros que no toman el tipo de objeto, como el destino 'Copy-Item', tienen un for-each incorporado utilizando llaves para que no haya necesidad de un bucle para determinar el destino.) – Richard

+0

Buddy, throws exception . "Copiar-Elemento: no se puede enlazar el argumento con el parámetro 'Ruta' porque es nulo." $ El archivo no contiene elementos cuando se especifica "*. *" – Samselvaprabu

+0

$ File = Get-ChildItem -Path "V: \ MyFolder \\ *. *" -Filter CopyForbuild.bat -Recurse $ i = 1 Foreach ($ f en $ archivo) { Copy-Item $ f.FullName ("E: \ copyforbuild \" + $ + $ f.BaseName i +) $ i ++ "txt."} – Samselvaprabu