2011-12-31 23 views
7

Ecco il codice che ho fatto :)ROBOCOPY - Copiare il contenuto delle cartelle in una singola cartella

@echo off 
set source="R:\Contracts\" 
set destination="R:\Contracts\Sites\" 
ROBOCOPY %source% %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 /S 
for /r %source in (*) do @copy "%destination" . 

R: \ Contratti \ è piena di cartelle contenenti file in esse.

Voglio copiare tutto su R: \ Contracts \ Sites \ e appiattire la struttura delle cartelle.

Tutto copia bene ma anche la struttura delle cartelle.

Grazie

+0

possibile duplicato di [Come copiare i file dall'albero delle cartelle lasciando cadere tutte le cartelle con Robocopy?] (Http://stackoverflow.com/questions/1502170/how-to-copy-files-from-folder-tree-dropping -all-the-folders-with-robocopy) –

risposta

9

Nessun singolo comando appiattire la gerarchia per voi; dovrai usare più comandi. Può essere fatto semplicemente usando FOR/R per camminare nella gerarchia, insieme al comando di scelta copia/sposta (sposta, copia, xcopy, robocopy). Poiché la destinazione è all'interno della gerarchia di origine, è necessario un IF per impedire che la destinazione diventi una fonte.

Prima di procedere, è necessario fermarsi e riflettere su ciò che accade se lo stesso nome file viene visualizzato in più cartelle di origine. Puoi avere solo una versione nella tua cartella di destinazione. Potete garantire che non esistano nomi duplicati? In caso contrario, quale file deve essere conservato? Come puoi strutturare il comando per mantenere il file che vuoi? Questa complicazione è probabilmente il motivo per cui non è stato mai scritto alcun comando per appiattire semplicemente una gerarchia.

Ecco il comando ROBOCOPY integrato con la soluzione FOR/R.

@echo off 
set source="R:\Contracts" 
set destination="R:\Contracts\Sites" 

::Not sure if this is needed 
::It guarantees you have a canonical path (standard form) 
for %%F in (%destination%) do set destination="%%~fF" 

for /r %source% %%F in (.) do if "%%~fF" neq %destination% ROBOCOPY "%%F" %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 
+0

Ciao dbenham, prima di tutto, grazie MOLTO. Ho provato il codice sopra tuttavia non sembra funzionare. Ho creato un file batch e l'ho testato. Ho letto il codice e non vedo alcun errore diretto. Per favore mi faccia sapere. Grazie – Arthor

+0

Ciao, ho rimosso questa riga "per %% F in (% destination%) do set destination ="% ~ fF "" e sembra funzionare. Tuttavia non sono sicuro che sia necessario. Se grazie Grazie DBENHAM – Arthor

+0

Oops: mancavo un% vicino alla fine di quella linea. È riparato ora. Lo scopo era quello di assicurarsi che il percorso fosse rappresentato in un modulo standard completo, in modo che la successiva istruzione IF funzioni correttamente. – dbenham

0

Recentemente ho dovuto affrontare questo problema, e molti file che ho voluto spostarsi dalla gerarchia a una singola cartella aveva lo stesso nome di un l'altro, e volevo appiattire ancora la gerarchia senza di loro a essere sovrascritto Quello che ho fatto è stato scrivere uno script che sposta il file, ma rinomina con il vecchio percorso della gerarchia in nome ad esempio: file di origine:

C: \ files \ somefiles \ file.txt

C

: \ files \ otherfiles \ file.txt

destinazione è C: \ newdir \ file vengono creati come

C: \ newdir \ somefiles-file.txt

C: \ newdir \ otherfiles-file.txt

Ecco il codice, file batch 1 passa attraverso i file, file batch 2 rinomina e li (sposta potrebbe anche copiare, invece, se si desidera mantenere la fonte:

@echo off 
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf" 

renameandmovefilespart2.bat

@echo off 
Setlocal EnableDelayedExpansion 
rem set the whole file path 
set origWhole=%1 
set origPathOnly=%2 
set extension=%3 
rem here you can set where the directory to hold the flattened hierarchy is 
set destDir=c:\destinationDir\ 
rem set the directory to do a string replace 
rem make this the starting directory, that you dont want in the newly renamed files 
set startingDir=C:\starting\directory\ 
set nothing= 
set slash=\ 
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=-- 
set quote=" 
rem cut out the starting part of the directory 
call set newname=%%origWhole:!startingDir!=!nothing!%% 
rem replace slashes with new character 
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%% 
rem remove quotes 
call set newname=%%newname:!quote!=!nothing!%% 
rem @echo shortened: %newname% 
rem @echo source path: %origPathOnly% newPath: %startingDir% 
rem @echo extension: %extension% 
rem rename the files 
ren %origWhole% %newname% 
rem prepare to move the file, clean up the source path 
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%% 
move "%origPathOnly%%newname%" "%destDir%" 
7

Si potrebbe fare ciò con un solo rivestimento PowerShell. In questo esempio filtro tutti i file con l'estensione .txt da tutte le sottocartelle. E quindi inviarli al Cmdlet Move-Item.

Combinare i Cmdlet get-Childitem (GCI in breve), -recurse, maby -filter e quindi reindirizzare il risultato al cmdlet Move-Item. Usa -Che prima cosa verifica che l'output sia quello che ti aspettavi.

Sposta nella cartella corrente

get-Childitem -recurse -filter *.txt | Move-Item -WhatIf 

Sposta in un'altra cartella

get-Childitem -recurse -filter *.txt | Move-Item -Destination c:\temp -WhatIf 
+0

brillante. semplice, facile da capire. – sonjz

0

C'è un vecchio programma di utilità PCMag chiamato Sweep.exe in grado di operare lo stesso comando nella corrente e sottodirectory. Non metterei la destinazione come una sottodirectory della directory di origine. Metti la destinazione altrove.

http://www.rarewares.org/files/case/Sweep.zip

cd c:\contracts sweep copy *.* c:\sites

Questo copierà tutto da c: \ contratti e sotto c: \ siti

io uso un comando simile per appiattire la gerarchia di una directory.

Fare attenzione con i duplicati e come si desidera gestirli. Vuoi sovrascrivere o gestire un modo diverso.

Problemi correlati