Robocopy tidak menyalin folder root dan stempel waktunya

10

Robocopy tidak menyalin folder root dan stempel waktunya - ia menyalin semua subdirektori dan file (ketika opsi yang sesuai ditetapkan) dan tampaknya tidak ada pilihan / argumen untuk memberi tahu Robocopy Anda ingin folder root itu sendiri dan cap waktu atau atributnya untuk disalin kata demi kata juga.

Jadi katakan saya ingin saya salin C: / Brushes

Robocopy akan menyalin semua subdirektori dan file ke tujuan, tetapi bukan folder Brushes itu sendiri, dengan semua atribut terkait dan cap waktu.

Anda mengerti apa yang saya minta? Ini cukup mendasar dan Robocopy tampaknya tidak memiliki pilihan untuk itu. Orang-orang telah mengajukan pertanyaan sebelumnya di berbagai forum tetapi sejauh yang saya ketahui, tidak ada yang menjawab pertanyaan itu.

masukkan deskripsi gambar di sini

ptrcao
sumber
1
Ini adalah selebaran, berdasarkan pengalaman saya dengan rsync, tetapi bagaimana jika Anda tidak memiliki garis miring di akhir folder target Anda? Bagaimana dengan mencoba memodifikasi skrip pada level baris perintah alih-alih menggunakan GUI? Saya tahu pasti bahwa alat baris perintah akan melakukan apa yang Anda butuhkan.
@ Randolph Barat: saat ini saya tidak memiliki garis miring di akhir folder target. Saya masih tidak bisa membuat Robocopy menyertakan folder sumber dan atributnya, dll. Dalam pekerjaan salin yang sebenarnya. Ada ide?
ptrcao
Jika tidak ada solusi untuk robocopy, Anda dapat melihat xxcopy (ada versi freeware dan komersial).
harrymc
Yap, saya mengerti sepenuhnya dan telah menambahkan solusi yang berfungsi di bawah ini. Masalah sebenarnya adalah Anda harus menentukan semua file dan folder di root TIDAK untuk disalin.
opsin

Jawaban:

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

Letakkan folder di atas batatau gunakan di Kirim Ke . Ini akan membuat folder dengan cap nama & waktu dari direktori sumber dan menyalin semua file.

Terence
sumber
terima kasih banyak, sedang mencari magic% ~ n1 operator
hotzen
@hotzen, Apa fungsinya %~n1?
Pacerier
"Perluas% 1 ke nama file."
hotzen
Microsoft memutus semua tautan mereka, di sini memiliki dokumentasi persen tilde untuk kumpulan, en.wikibooks.org/wiki/Windows_Batch_Scripting#Percent_tilde
kevinf
3

Saya setuju dengan OP, tidak bisa menyalin folder root adalah kekurangan besar robocopy. Bagaimana dengan menyontek dan memindahkan folder kuas ke folder sementara, melakukan operasi robocopy pada folder sementara, lalu memindahkannya kembali?

Sesuatu seperti:

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
sumber
2

Coba md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushesdari baris perintah, gantikan jalur yang benar.

ctype.h
sumber
3
Ya, tetapi Anda membuat folder baru yang tidak memiliki atribut folder C: \ brushes asli ...?
ptrcao
2

Seperti yang saya lihat tidak ada solusi yang baik dan mudah di salah satu jawaban:

Jika tidak ada solusi untuk robocopy, Anda dapat melihat xxcopy (ada versi freeware dan komersial).

Tentu saja ada banyak alternatif lain selain robocopy, ada juga yang terdaftar di sini .
Lihat juga Utilitas Salin File Gratis Terbaik .

harrymc
sumber
1
xxcopyadalah utilitas yang bagus, tetapi versi freeware memiliki prompt yang harus Anda tanggapi jika Anda menggunakan salah satu dari daftar besar saklar baris perintah. Menggunakan xxcopydari jendela perintah, prompt tambahan ini menjengkelkan. Tapi itu mencegah (menyulitkan) penggunaan dari xxcopyfile batch sama sekali.
Kevin Fegan
1

Jawaban user105198 adalah setengah jalan,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes memang akan hanya membuat folder baru. Anda harus menambahkan / MIR dan / DCOPY: T untuk itu

Dengan opsi / mir , jika direktori tujuan ada, pengaturan keamanan direktori tujuan ditimpa. Technet

/DCOPY:T :: COPY Directory Timestamps.

digabungkan bersama, berarti: atribut direktori waktu dan cap waktu akan dicerminkan ke folder yang dibuat.

begitu:

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

sumber
1

Saya pikir Anda akan menemukan bahwa Robocopy melakukan apa yang Anda inginkan, asalkan Anda menyuruhnya menyalin cap waktu folder (/ DCOPY: T). Dari eksperimen saya, saya menemukan perilaku (tampaknya tidak berdokumen) berikut ini berlaku untuk Robocopy:

Semua properti yang ditentukan dari direktori sumber diterapkan ke direktori tujuan, terlepas dari apakah direktori tujuan ada, tidak ada, atau memiliki nama yang berbeda dari direktori sumber.

Properti yang ditentukan dapat mencakup (setidaknya) informasi keamanan (/ SEC) atau cap waktu folder (/ DCOPY: T).

Oleh karena itu, dalam contoh berikut, folder c: \ destination \ akan diberi cap waktu yang sama dengan folder c: \ source \.

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

Saya menguji ini dengan versi Robocopy yang disertakan dengan Windows 7, Windows 8, dan Windows 2003 Resource Kit (/ parameter SEC saja). Perhatikan bahwa hanya versi Robocopy yang lebih baru (XP026 dan lebih tinggi) yang mendukung parameter / DCOPY: T.

briffles
sumber
0

Jika Anda bergabung /IF :: Include the following Files.dengan /E :: copy subdirectories, including Empty ones.Anda mendapatkan (dekat dengan) efek yang diinginkan:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
ta.speot.is
sumber
1
Apa maksudmu "dekat"? Apa batasan yang Anda maksudkan?
ptrcao
Bahaya Will Robinson !!! Saran Anda tampaknya menyalin setiap folder di folder saat ini, tidak membatasinya ke folder yang diawali dengan "Brushes"
GlennFromIowa
0

Robocopy sebenarnya tidak dirancang untuk melakukannya dengan mudah. Namun, ada caranya.

Root folder berisi katakanlah 50 file dan 40 folder. Anda hanya ingin folder X (tetapi Anda juga ingin cap waktu dan tanggal).

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

The / DCOPY: T memberitahukannya untuk menjaga waktu stempel folder. / XF menentukan file yang TIDAK untuk disalin, / XD menentukan folder mana yang TIDAK untuk disalin. Hanya saja, jangan tentukan folder c: \ X.

Kelemahan utama dari ini adalah meneliti semua folder dan nama file di root dan secara khusus memanggil mereka semua di sini. Jika Anda sering melakukan ini pada sistem yang berbeda, skrip dapat ditulis.

Contoh Kerja

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

Contoh Pekerjaan Rooting

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

Pengujian saya berhasil, saya membuat beberapa folder dan sub folder, c: \ testing adalah root dalam kasus ini, c: \ abc adalah root dari drive lain (jelas mereka tidak benar-benar, tetapi untuk tujuan ini seharusnya masuk akal). Folder yang saya inginkan dari root disebut "Folder Baru", seperti yang Anda lihat saya tidak menentukannya di / XD. Juga, pastikan Anda menentukan c: \ atau nama yang Anda gunakan akan mendunia. Dengan kata lain jika saya tidak menentukan c: \ testing dari file Testing.txt, itu akan menghilangkannya dari SEMUA subfolder yang disalin. / SEC akan menyalin semua keamanan file dan stempel waktu.

opsin
sumber
Hmmm, saya kira Anda bisa menggunakan / XF c: *. * Untuk mengecualikan semua file root. Saya akan mengujinya ketika saya di depan mesin dan tidak di telepon.
opsin
Tidak, c: *. * Tidak valid, Anda harus mendaftar secara manual semua file.
opsin
0

Secara teori, menggunakan /DCOPY:Tharus menyelesaikan semua masalah Anda.

Tapi, saya sudah melihat ini terjadi, dan saya tidak yakin saya akan menyebutnya "bug", tetapi lebih merupakan konsekuensi dari urutan operasi (OK, bug).

Perintah ini harus berfungsi untuk menyalin semua file dari C:\Brusheske D:\NEWBrushes, dan /DCOPY:Tmenyebabkan cap waktu dari folder sumber disalin ke folder tujuan:

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

Apa yang saya lihat (setidaknya pada beberapa versi Robocopy) adalah bahwa perintah berhasil, tetapi cap waktu D:\NEWBrushesfolder diatur ke tanggal dan waktu saat ini.

Jadi sepertinya /DCOPY:Tfitur tersebut tidak berfungsi untuk folder "basis" (paling atas) yang Anda salin.

Saya percaya ini berfungsi, tetapi stempel waktu dari folder tujuan sedang "diinjak" oleh operasi yang kemudian dalam urutan operasi.

Apa yang saya yakini sedang terjadi untuk perintah ini:

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

adalah sesuatu seperti ini:

  1. Buat folder D:\NEWBrushesjika belum ada
  2. Salin cap waktu dari C:\BrusheskeD:\NEWBrushes
  3. Salin file dan sub folder dari C:\BrusheskeD:\NEWBrushes

Tampaknya Langkah 3, modifikasi isi folder D:\NEWBrushesmenyebabkan stempel waktu D:\NEWBrushesberubah.

Bagi saya, "solusi" adalah menjalankan robocopyperintah untuk menyalin file dan folder, kemudian jalankan perintah (yang sama) robocopyuntuk kedua kalinya.

Jadi, pertama kali Anda menjalankan:

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

semua file dan folder akan disalin. Kemudian jalankan lagi:

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

Kali kedua robocopyberjalan, tidak ada file atau folder di dalam D:\NEWBrushesakan diubah, dan /DCOPY:Topsi akan memberitahu robocopyuntuk menyalin cap waktu dari C:\Brusheske D:\NEWBrushes(kecuali ada folder / file di C:\Brushesyang telah berubah sejak menjalankan pertama kali robocopy).

Kevin Fegan
sumber
-1

Saya sedang memecahkan folder root sekarang untuk satu skrip cadangan sangat cepat dan mudah dengan robocopy, ada contoh. Harus membantu siapa pun:

$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
sumber
Jadi gunakan PowerScript ini dan masalahnya teratasi, kan?
Pimp Juice,