Robocopy nie kopiuje folderu głównego i jego znacznika czasu

10

Robocopy nie kopiuje folderu głównego i jego sygnatury czasowej - kopiuje wszystkie podkatalogi i pliki (po ustawieniu odpowiednich opcji) i wydaje się, że nie ma opcji / argumentu, który by powiedziałby Robocopy, że chcesz samego folderu głównego oraz jego znacznika czasu lub atrybutów do skopiowania również dosłownie.

Powiedzmy, że chcę skopiować C: / Brushes

Robocopy skopiuje wszystkie swoje podkatalogi i pliki do miejsca docelowego, ale nie sam folder Brushes, ze wszystkimi powiązanymi atrybutami i znacznikiem czasu.

Rozumiesz o co pytam? Jest to dość podstawowe i Robocopy wydaje się nie mieć na to opcji. Ludzie zadawali to pytanie na różnych forach, ale o ile mi wiadomo, nikt nie odpowiedział na to pytanie.

wprowadź opis zdjęcia tutaj

ptrcao
źródło
1
To jest ulotka, oparta na moim doświadczeniu z rsync, ale co, jeśli nie masz końcowego ukośnika na końcu folderu docelowego? Co powiesz na próbę zmodyfikowania skryptu na poziomie wiersza poleceń zamiast korzystania z GUI? Wiem na pewno, że narzędzie wiersza polecenia zrobi to, czego potrzebujesz.
@Randolph West: obecnie nie mam końcowego ukośnika na końcu folderu docelowego. Nadal nie mogę zmusić Robocopy do włączenia folderu źródłowego i jego atrybutów itp. Do rzeczywistego zadania kopiowania. Jakieś pomysły?
ptrcao
Jeśli nie ma rozwiązania dla robocopy, możesz rzucić okiem na xxcopy (istnieją wersje darmowe i komercyjne).
harrymc
Tak, rozumiem całkowicie i dodałem poniżej działające rozwiązanie. Prawdziwy problem polega na tym, że NIE należy kopiować wszystkich plików i folderów w katalogu głównym.
opsin

Odpowiedzi:

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

Upuść folder na batlub użyj w Wyślij do . Utworzy folder z nazwą i znacznikiem czasu katalogu źródłowego i skopiuje wszystkie pliki.

Terence
źródło
dziękuję bardzo, szukałem tego magicznego operatora% ~ n1
hotzen
@hotzen, co robi %~n1?
Pacerier,
„Rozwija% 1 do nazwy pliku.”
hotzen,
Microsoft zepsuł wszystkie swoje łącza, tutaj jest dokumentacja procentowa tyldy dla partii, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
3

Zgadzam się z OP, że niemożność skopiowania folderu głównego jest dużą wadą robocopy. Co powiesz na oszukiwanie i przenoszenie folderu pędzli do folderu tymczasowego, wykonanie operacji robocopy na folderze tymczasowym, a następnie przeniesienie go z powrotem?

Coś jak:

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
Jimadine
źródło
2

Spróbuj md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesz wiersza polecenia, zastępując prawidłowe ścieżki.

ctype.h
źródło
3
Tak, ale tworzysz nowy folder, który nie będzie miał atrybutów oryginalnego folderu C: \ brushes ...?
ptrcao
2

Jak nie widzę żadnego dobrego i łatwego rozwiązania w żadnej z odpowiedzi:

Jeśli nie ma rozwiązania dla robocopy, możesz rzucić okiem na xxcopy (istnieją wersje darmowe i komercyjne).

Istnieje oczywiście wiele innych alternatyw dla robocopy, niektóre są wymienione tutaj .
Zobacz także Najlepsze bezpłatne narzędzie do kopiowania plików .

harrymc
źródło
1
xxcopyjest doskonałym narzędziem, ale wersja bezpłatna zawiera monit, na który musisz odpowiedzieć, jeśli używasz dużej listy przełączników wiersza poleceń. xxcopyTen dodatkowy monit przy użyciu okna poleceń jest irytujący. Ale w ogóle zapobiega (komplikuje) korzystanie xxcopyz pliku wsadowego.
Kevin Fegan
1

odpowiedź user105198 jest w połowie drogi,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes stworzy po prostu nowy folder. Trzeba będzie dopisywania / MIR i / DCOPY: T do niego

W przypadku opcji / mir , jeśli katalog docelowy istnieje, ustawienia zabezpieczeń katalogu docelowego są zastępowane. Technet

/DCOPY:T :: COPY Directory Timestamps.

połączone razem oznaczają: atrybuty katalogu źródłowego i znaczniki czasu zostaną dublowane w utworzonym folderze.

więc:

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

źródło
1

Myślę, że przekonasz się, że Robocopy robi dokładnie to, co chcesz, pod warunkiem, że powiesz mu, aby skopiował znaczniki czasu folderów (/ DCOPY: T). Z moich eksperymentów wynika, że ​​następujące (pozornie nieudokumentowane) zachowanie jest prawdziwe dla Robocopy:

Wszystkie określone właściwości katalogu źródłowego są stosowane do katalogu docelowego, niezależnie od tego, czy katalog docelowy istnieje, nie istnieje lub ma inną nazwę niż katalog źródłowy.

Określone właściwości mogą obejmować (przynajmniej) informacje o bezpieczeństwie (/ SEC) lub znaczniki czasu folderu (/ DCOPY: T).

Dlatego w poniższym przykładzie do folderu c: \ destination \ folder zostaną przypisane te same znaczniki czasu co folder c: \ source \ folder.

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

Przetestowałem to z wersjami Robocopy zawartymi w systemie Windows 7, Windows 8 i Windows 2003 Resource Kit (tylko parametr / SEC). Zauważ, że tylko nowsze wersje Robocopy (XP026 i nowsze) obsługują parametr / DCOPY: T.

btriffles
źródło
0

Jeśli połączysz się /IF :: Include the following Files.z nią /E :: copy subdirectories, including Empty ones., uzyskasz (blisko) pożądany efekt:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
ta.speot.is
źródło
1
Co masz na myśli „blisko”? Jakie ograniczenia implikujesz?
ptrcao
Niebezpieczeństwo zrobi Robinson !!! Twoja sugestia wydaje się kopiować każdy folder w bieżącym folderze, a nie ograniczać go do folderów zaczynających się na „Pędzle”
GlennFromIowa
0

Robocopy nie jest tak zaprojektowane, aby to zrobić łatwo. Istnieje jednak sposób.

Folder główny zawiera, powiedzmy, 50 plików i 40 folderów. Potrzebujesz tylko folderu X (ale chcesz też, aby był to znacznik czasu i daty).

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

Opcja / DCOPY: T nakazuje zachowanie znaczników czasu folderu. / XF określa, które pliki NIE mają być kopiowane, / XD określa, które foldery NIE mają być kopiowane. Po prostu nie określaj folderu c: \ X.

Główną wadą tego jest wyszukiwanie wszystkich folderów i nazw plików w katalogu głównym, a konkretnie wywoływanie ich wszystkich tutaj. Jeśli robisz to dużo na różnych systemach, skrypt może zostać napisany.

Przykład roboczy

robocopy c: \ testowanie c: \ abc / XF c: \ testowanie \ Testowanie.txt / XD "C: \ testowanie \ Nowy folder (2)" "C: \ testowanie \ Nowy folder (3)" / S / E / SEC / DCOPY: T

Przykład działania rootowania

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

Mój test zadziałał, tworzę kilka folderów i podfolderów, c: \ testowanie w tym przypadku było rootem, c: \ abc było rootem innego dysku (oczywiście tak nie jest, ale w tym celu powinno to mieć sens). Folder, który chciałem z katalogu głównego, nazywał się „Nowy folder”, jak widać, nie określiłem go w katalogu / XD. Upewnij się również, że podałeś c: \, ponieważ używane nazwy będą globalne. Innymi słowy, jeśli nie określiłem c: \ testowanie z pliku Testing.txt, pomijałby to WSZYSTKIE kopiowane podfoldery. / SEC skopiuje wszystkie zabezpieczenia plików i znaczniki czasu.

opsin
źródło
Hmmm, przypuszczam, że możesz użyć / XF c: *. *, Aby wykluczyć wszystkie pliki root. Przetestuję to, gdy jestem przed maszyną, a nie na telefonie.
opin,
Nie, c: *. * Jest niepoprawny, musisz ręcznie wyświetlić listę wszystkich plików.
Środa
0

Teoretycznie używanie /DCOPY:Tpowinno rozwiązać wszystkie problemy.

Ale widziałem, że tak się dzieje i nie jestem pewien, czy nazwałbym to „błędem”, ale raczej konsekwencją sekwencji operacji (OK, błąd).

To polecenie powinno działać, aby skopiować wszystkie pliki z C:\Brushesdo D:\NEWBrushesi /DCOPY:Tpowinno spowodować skopiowanie znaczników czasu folderu źródłowego do folderu docelowego:

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

Widziałem (przynajmniej w niektórych wersjach Robocopy), że polecenie się powiodło, ale znacznik czasu D:\NEWBrushesfolderu jest ustawiony na bieżącą datę i godzinę.

Wygląda więc na to, że /DCOPY:Tfunkcja nie działa dla kopiowanego folderu „podstawowego” (najwyższego).

Uważam, że działa, ale znacznik czasu folderu docelowego jest „przyspieszany” przez operacje, które są później w sekwencji operacji.

Wydaje mi się, że dzieje się to dla tego polecenia:

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

jest coś takiego:

  1. Utwórz folder, D:\NEWBrushesjeśli jeszcze nie istnieje
  2. Skopiuj znacznik czasu z C:\BrushesdoD:\NEWBrushes
  3. Skopiuj pliki i podfoldery z C:\BrushesdoD:\NEWBrushes

Wygląda na to, że krok 3, zmiana zawartości folderu D:\NEWBrushespowoduje zmianę znacznika czasu D:\NEWBrushes.

Dla mnie „obejściem” było uruchomienie robocopypolecenia skopiowania plików i folderów, a następnie ponowne uruchomienie (tego samego) robocopypolecenia.

Więc przy pierwszym uruchomieniu:

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

wszystkie pliki i foldery zostaną skopiowane. Następnie uruchom go ponownie:

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

Przy drugim robocopyuruchomieniu żadne pliki ani foldery D:\NEWBrushesnie zostaną zmodyfikowane, a /DCOPY:Topcja poinformuje robocopyo skopiowaniu znacznika czasu z C:\Brushesdo D:\NEWBrushes(chyba że istnieją foldery / pliki C:\Brushes, które zmieniły się od pierwszego uruchomienia robocopy).

Kevin Fegan
źródło
-1

Rozwiązałem teraz foldery główne dla jednego naprawdę szybkiego i łatwego skryptu tworzenia kopii zapasowych za pomocą robocopy, jest przykład. Powinien pomóc każdemu:

$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

}
Milhauzz
źródło
Więc użyj tego PowerScript, a problem zostanie rozwiązany, prawda?
Pimp Juice IT,