Robocopy non copia la cartella principale e il relativo timestamp


10

Robocopy non copia la cartella principale e il relativo timestamp, ma copia tutte le sottodirectory e i file (quando sono impostate le opzioni appropriate) e non sembra esserci alcuna opzione / argomento per dire a Robocopy che si desidera la cartella principale stessa e il relativo timestamp o attributi da copiare anche alla lettera.

Quindi dì che voglio che voglio copiare C: / Brushes

Robocopy copierà tutte le sue sottodirectory e file nella destinazione, ma non nella cartella Brushes stessa, con tutti gli attributi e il timestamp associati.

Capisci quello che ti sto chiedendo? Questo è piuttosto semplice e Robocopy sembra non avere un'opzione per questo. Le persone hanno posto la domanda in precedenza in vari forum, ma per quanto mi riguarda, nessuno ha risposto alla domanda.

inserisci qui la descrizione dell'immagine


1
Questo è un volantino, basato sulla mia esperienza con rsync, ma cosa succede se non hai una barra finale alla fine della cartella di destinazione? Che ne dici di provare a modificare lo script a livello di riga di comando invece di usare la GUI? So per certo che lo strumento da riga di comando farà ciò di cui hai bisogno.

@Randolph West: al momento non ho una barra finale alla fine della cartella di destinazione. Non riesco ancora a fare in modo che Robocopy includa la cartella di origine e i suoi attributi, ecc. Nel processo di copia effettivo. Qualche idea?
ptrcao,

Se non esiste una soluzione per robocopy, puoi dare un'occhiata a xxcopy (ci sono versioni freeware e commerciali).
harrymc,

Sì, ho capito completamente e ho aggiunto una soluzione funzionante di seguito. Il vero problema è che devi specificare tutti i file e le cartelle nella radice da NON copiare.
opsin

Risposte:


9
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

Rilasciare una cartella su bato utilizzare in Invia a . Creerà una cartella con nome e data e ora della directory di origine e copierà tutti i file.


grazie mille,
cercavo quell'operatore

@hotzen, che cosa fa %~n1?
Pacerier,


"Espande% 1 in un nome file."
hotzen

Microsoft ha rotto tutti i suoi collegamenti, qui ha la documentazione della tilde percentuale per batch, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf

3

Concordo con l'OP, non riuscire a copiare la cartella principale è un grosso difetto di robocopy. Che ne dici di barare e spostare la cartella dei pennelli in una cartella temporanea, eseguire l'operazione robocopy sulla cartella temporanea, quindi spostarla indietro?

Qualcosa di simile a:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred

2

Prova md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesdalla riga di comando, sostituendo i percorsi corretti.


3
Sì, ma stai creando una nuova cartella che non avrà gli attributi della cartella C: \ brushes originale ...?
ptrcao,

2

Come posso vedere nessuna soluzione buona e facile in nessuna delle risposte:

Se non esiste una soluzione per robocopy, puoi dare un'occhiata a xxcopy (ci sono versioni freeware e commerciali).

Ci sono ovviamente molte altre alternative a robocopy, alcune sono elencate qui .
Vedi anche la migliore utilità per la copia di file gratuita .


1
xxcopyè una grande utility, ma la versione freeware ha un prompt a cui devi rispondere se usi uno di un ampio elenco di opzioni della riga di comando. Utilizzando xxcopyda una finestra di comando, questo prompt aggiuntivo è irritante. Ma impedisce (complica) l'utilizzo di xxcopyun file batch.
Kevin Fegan,

1

la risposta di user105198 è a metà strada,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes creerà semplicemente una nuova cartella. Dovrai aggiungere / MIR e / DCOPY: T ad esso

Con l' opzione / mir , se esiste la directory di destinazione, le impostazioni di sicurezza della directory di destinazione vengono sovrascritte. Technet

/DCOPY:T :: COPY Directory Timestamps.

combinati insieme, significa: gli attributi e i timestamp della directory di origine verranno rispecchiati nella cartella creata.

così:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T

1

Penso che scoprirai che Robocopy fa esattamente quello che vuoi, purché tu gli dica di copiare i timestamp delle cartelle (/ DCOPY: T). Dai miei esperimenti, ho trovato il seguente comportamento (apparentemente non documentato) vero per Robocopy:

Tutte le proprietà specificate della directory di origine vengono applicate alla directory di destinazione, indipendentemente dal fatto che la directory di destinazione esista, non esista o abbia un nome diverso dalla directory di origine.

Le proprietà specificate possono includere (almeno) le informazioni di sicurezza (/ SEC) o i timestamp delle cartelle (/ DCOPY: T).

Pertanto, nel seguente esempio, a c: \ destinazione \ cartella verranno assegnati gli stessi timestamp di c: \ fonte \ cartella.

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

Ho provato questo con le versioni di Robocopy incluse con Windows 7, Windows 8 e Windows 2003 Resource Kit (solo parametro / SEC). Notare che solo le versioni più recenti di Robocopy (XP026 e successive) supportano il parametro / DCOPY: T.


0

Se ti combini /IF :: Include the following Files.con /E :: copy subdirectories, including Empty ones.ottieni (vicino a) l'effetto desiderato:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"

1
Cosa intendi con "vicino a"? Qual è la limitazione che stai insinuando?
ptrcao,

Il pericolo sarà Robinson !!! Il tuo suggerimento sembra copiare ogni cartella nella cartella corrente, non limitarla alle cartelle che iniziano con "Pennelli"
GlennFromIowa

0

Robocopy non è progettato per farlo facilmente. Tuttavia, c'è un modo.

La cartella principale contiene 50 file e 40 cartelle. Vuoi solo la cartella X (ma vuoi anche la data e l'ora).

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

Il / DCOPY: T dice di mantenere i timestamp della cartella. / XF specifica quali file NON copiare, / XD specifica quali cartelle NON copiare. Basta non specificare la cartella c: \ X.

Lo svantaggio principale di questo è la ricerca di tutte le cartelle e i nomi dei file nella radice e in particolare li chiama tutti qui. Se lo fai molto su sistemi diversi, potrebbe essere scritto uno script.

Esempio di lavoro

robocopy c: \ testing c: \ abc / XF c: \ testing \ Testing.txt / XD "C: \ testing \ New Folder (2)" "C: \ testing \ New Folder (3)" / S / E / SEC / DCOPY: T

Esempio di funzionamento della radice

robocopy c: \ d: \ / XF c: \ Testing.txt / XD "C: \ New Folder (2)" "C: \ New Folder (3)" / S / E / SEC / DCOPY: T

Il mio test ha funzionato, ho creato alcune cartelle e sottocartelle, c: \ testing era root in questo caso, c: \ abc era root di un'altra unità (ovviamente non lo sono, ma a questo scopo avrebbe senso). La cartella che volevo dalla radice era chiamata "Nuova cartella", come puoi vedere non l'ho specificata in / XD. Inoltre, assicurati di specificare c: \ oi nomi che utilizzi saranno globali. In altre parole, se non avessi specificato c: \ testing dal file Testing.txt, lo avrei omesso da TUTTE le sottocartelle da copiare. Il / SEC copierà tutta la sicurezza dei file e i timestamp.


Hmmm, suppongo che potresti usare / XF c: *. * Per escludere tutti i file root. Lo proverò quando sono davanti a una macchina e non al telefono.
opsin

No, c: *. * Non è valido, dovrai elencare manualmente tutti i file.
opsin

0

In teoria, l'utilizzo /DCOPY:Tdovrebbe risolvere tutti i tuoi problemi.

Ma l'ho visto accadere e non sono sicuro che lo definirei un "bug", ma piuttosto una conseguenza della sequenza di operazioni (OK, bug).

Questo comando dovrebbe funzionare per copiare tutti i file dal C:\Brushesal D:\NEWBrushes, e /DCOPY:Tdovrebbe causare il timestamp della cartella di origine da copiare nella cartella di destinazione:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

Quello che ho visto (almeno su alcune versioni di Robocopy) è che il comando ha esito positivo, ma il timestamp della D:\NEWBrushescartella è impostato sulla data e l'ora correnti.

Quindi sembra che la /DCOPY:Tfunzione non funzioni per la cartella "base" (più in alto) che si sta copiando.

Credo che funzioni, ma che il timestamp della cartella di destinazione sia "calpestato" da operazioni che sono più avanti nella sequenza operativa.

Quello che credo stia accadendo per questo comando:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

è qualcosa del genere:

  1. Crea una cartella D:\NEWBrushesse non esiste già
  2. Copia il timestamp da C:\BrushesaD:\NEWBrushes
  3. Copia file e sottocartelle da C:\BrushesaD:\NEWBrushes

Sembra che il passaggio 3, la modifica del contenuto della cartella D:\NEWBrushescausi la D:\NEWBrushesmodifica del timestamp di .

Per me, la "soluzione alternativa" è stata quella di eseguire il robocopycomando per copiare i file e le cartelle, quindi eseguire il (stesso) robocopycomando una seconda volta.

Quindi, la prima volta che esegui:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

tutti i file e le cartelle verranno copiati. Quindi eseguirlo di nuovo:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

La seconda volta robocopyviene eseguito, nessun file o cartella all'interno D:\NEWBrushesverrà modificato e l' /DCOPY:Topzione indicherà robocopydi copiare il timestamp da C:\Brushesa D:\NEWBrushes(a meno che non ci siano cartelle / file C:\Brushesche sono cambiati dalla prima esecuzione di robocopy).


-1

Stavo risolvendo le cartelle di root in questo momento per uno script di backup davvero rapido e semplice con robocopy, c'è un esempio. Dovrebbe aiutare a chiunque:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}

Quindi usa questo PowerScript e il problema è risolto, giusto?
Pimp Juice IT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.