2011-12-30 12 views
9

Sto provando a copiare ricorsivamente i file e rinominarli.Rinomina dopo aver copiato utilizzando powershell

Le mie cartelle hanno un file con lo stesso nome, quindi ho bisogno di rinominarlo nel momento in cui è stato copiato.

Ma io continuo ad affrontare il problema. Di seguito è riportato il mio codice. Dovrebbe trovare il file CopyForBuild.bat e copiarlo nella cartella E: \ CopyForBuild. Una volta copiato, il primo file dovrebbe essere Copyforbuild1.txt, il secondo sarà CopyforBuild2.txt e così via.

Il seguente è il mio codice. Dove sto fallendo?

$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 
} 

risposta

14

È possibile rinominare il file durante la copia in copia-Item, basta fornire il percorso completo in entrambi i luoghi:

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

Ciò rinomina 1.config a 2.config. Non è necessario chiamare la funzione di rinomina separata. Il codice dovrebbe essere simile a questo:

$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++ 
} 

Si può rendere ancora più breve se l'uso ciclo 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 via più breve e più larga se seguire il commento di Richard

+4

Perché non processo tutto uno alla volta (e ricorda che le variabili ricevono valori predefiniti): 'Get-ChildItem -Path V: \ MyFolder -filt CoptForBuild.bat -rec | Copia-Item -dest {"E: \ copyforbuild \" + $ _. BaseName + ($ i ++) + ". Txt"} '. (I cmdlet con parametri che non accettano l'oggetto di tipo, come la destinazione di "Copia-Oggetto", hanno un insito per-ciascuno usando le parentesi graffe quindi non c'è bisogno di un ciclo per determinare la destinazione.) – Richard

+0

Compagno, Si genera un'eccezione . "Copy-Item: Impossibile associare l'argomento al parametro 'Path' perché è null." $ File non contiene elementi quando si specifica "*. *" – Samselvaprabu

+0

$ 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 +) $ i ++ "txt".} – Samselvaprabu

Problemi correlati