2011-02-08 16 views
6

Ho bisogno di copiare un numero elevato di file in una cartella di backup, ma voglio mantenere i loro percorsi relativi. Ho solo bisogno di file specifici; vale a direCopia un file incluso il relativo percorso

C:\scripts\folder\File.ext1 
C:\scripts\folder2\file2.ext2 
C:\scripts\file3.ext1 

Ma ho solo bisogno di copiare i file EXT1 in questo modo:

C:\backup\folder\File.ext1.bak 
C:\backup\file3.ext1.bak 

I percorsi di origine sono più di profondità. Questo è quello che ho da copiare i file:

$files = gci -path C:\scripts\ -recurse -include *.ext1 
$files | % { Copy-Item $_ "$($_).bak"; move-item $_ -destination C:\backup\ } 

discariche Questo solo tutti i file in C: \ backup \ e non sembra per ottenere uno dei percorsi. Non sono sicuro di come sarebbe stata eseguita questa parte.

risposta

6

Qualcosa di simile potrebbe funzionare:

gci -path C:\scripts\ -recurse -include *.ext1 | 
    % { Copy-Item $_.FullName "$($_.FullName).bak" 
     move-item $_.FullName -destination ($_.FullName -replace 'C:\\scripts\\','C:\backup\') } 

Non è intelligente, ma è veloce & sporca e funziona senza un grande sforzo.

+1

Potrebbe voler raddoppiare quelle barre retroverse in "C: \ scripts \" nella sostituzione. Questa è un'espressione regolare. – mjolinor

+0

Certo, grazie. Lo dimentico sempre :) – stej

+0

Sembra che farà il lavoro. Darò un colpo e ti faccio sapere se funziona. – MrGrant

1

si può provare questo

Clear-Host 
$from = "'C:\scripts\" 
$to = "'C:\backup\" 
$inc = @('*.ext1', '*.extx') 
$files = get-childItem -path $from -include $inc -Recurse 
$files | % {$dest = (Join-Path $to $($_.FullName+".bak").SubString($from.length)); $dum = New-Item -ItemType file $dest -Force; Copy-Item -Path $_ -Destination $dest -Recurse -Force } 

il nuovo elemento è lì per forzare la creazione di percorso.

Jean Paul

2

Utilizzare robocopy.

robocopy c:\scripts c:\backup *.ext1 /s 

Ops. Non sono riuscito a notare che volevi aggiungere anche l'estensione .bak. Continuo a pensare che sia una buona idea usare robocopy per copiare i file, allora:

dir c:\backup -recurse -include *.ext1 | % { ren $_ "$_.bak" } 
+1

Potrei farlo con la robocopy sì, ma volevo vedere se c'era un modo per farlo con puramente PowerShell. – MrGrant

3

get-childitem ritorna percorsi assoluti, ma è possibile farli relativo alla directory di lavoro corrente come segue:

resolve-path -relative 

Quindi, per copiare un insieme filtrato di file dalla directory corrente in modo ricorsivo a una directory di destinazione:

$dest = "c:\dest" 
$filter = "*.txt" 

get-childitem -recurse -include $filter | ` 
    where-object { !$_.PSIsContainer } | ` 
    resolve-path -relative | ` 
    % { $destFile = join-path $dest $_; new-item -type f $destFile -force | out-null; copy-item $_ $destFile; get-item $destfile; } 

nuovo elemento è necessario per creare le directory superiori

get-item fornisce una visualizzazione di tutti i nuovi file ha creato

Naturalmente robocopy fa tutto questo, ma ci saranno momenti in cui si vuole fare il filtraggio più speciale o il nome del file storpiatura ...

+0

Puoi passare il flag '-File' a' get-childitem' e quindi non devi fare 'where-object {! $ _. PSIsContainer}' – Polymorphix

Problemi correlati