Bagaimana cara menyalin file ke tujuan hanya jika file sumber lebih baru daripada file tujuan?


0

Saya mencari cara untuk menyelesaikan tugas ini. Saya sudah mencoba robocopy dan menulis file batch, tetapi robocopy tampaknya tidak dapat melakukannya (karena / MINAGE tidak dapat melakukan waktu - hanya tanggal), dan menulis file batch untuk melakukan semua ini sedikit melebihi saya karena menjadi agak rumit dan berubah menjadi kode spageti.

1) Seseorang mengunggah file ke folder sumber di server (S-drive).

2) Beberapa workstation memeriksa S-drive secara berkala (setiap 5 menit).

3) Workstation memiliki satu file di folder tujuan. Jika workstation melihat bahwa S-drive memiliki file yang lebih baru dari file di folder tujuan di workstation, workstation hanya menyalin file terbaru dari S-drive ke folder tujuan. Nama file tidak penting di sini - hanya cap waktu yang penting.

Di sisi lain, jika folder tujuan workstation memiliki file dengan stempel waktu yang sama atau lebih baru daripada pada S-drive (bahkan jika itu adalah nama file yang berbeda), itu tidak boleh menyalin file.

4) Workstation menjalankan file batch terpisah untuk mengganti nama dan memproses file baru.


Tulis di PowerShell, bukan batch. :)
Ƭᴇcʜιᴇ007

Jawaban:


1

Untuk menyederhanakan pertanyaan Anda (seperti yang saya mengerti), Anda ingin:

  1. Lihatlah direktori sumber dan dapatkan file terbaru
  2. Lihatlah direktori tujuan dan dapatkan file terbaru
  3. bandingkan perangko waktu dari kedua file ini
  4. Jika file direktori sumber (langkah 1) lebih baru dari file direktori tujuan (langkah 2), salin ke direktori tujuan.
  5. Jika disalin, ganti nama file baru di direktori tujuan.

Langkah 1 dan 2 dapat dilakukan dengan for for:

atur SOURCE_SERVER = \\ server \ sumber
atur DEST_SERVER = C: \ Folder Tujuan

atur SOURCE_LATEST =
set DEST_LATEST =

REM Stempel waktu terbaru di direktori sumber
untuk / f "token = *" %% A in ('dir "% SOURCE_SERVER% \ *. *" / b / o: -d') lakukan (
    jika tidak didefinisikan SOURCE_LATEST setel SOURCE_LATEST = %% ~ fA)

Stempel waktu terbaru REM di direktori tujuan
untuk / f "token = *" %% A in ('dir "% DEST_SERVER% \ *. *" / b / o: -d') lakukan (
    jika tidak didefinisikan DEST_LATEST atur DEST_LATEST = %% ~ fA)

Lebih banyak bantuan tentang itu di sini: Bagaimana cara saya menulis skrip batch Windows untuk menyalin file terbaru dari direktori?

Langkah 3 : Sekarang Anda tahu file terbaru di setiap lokasi. Saatnya membandingkan cap waktu mereka untuk melihat file mana yang lebih baru. Kita dapat menggunakan wmic untuk mengambil stempel waktu untuk setiap file yang dapat dibandingkan dengan operator relasional: misalnya 20150129113038 (yang sama dengan 29 Januari 2015 pukul 11:30:38) lebih besar dari 20150129112533 ​​(29 Jan 2015 di 11:25:33 ).

set DEST_FILE_DATE =
atur SOURCE_FILE_DATE =

untuk / f "token = 1 lewati = 1 delims =." %% A dalam ('file data wm di mana nama ^ = "% SOURCE_LATEST: \ = \\%" dapatkan "Terakhir Dimodifikasi"') lakukan (
    jika tidak didefinisikan SOURCE_FILE_DATE setel SOURCE_FILE_DATE = %% A)

untuk / f "token = 1 lewati = 1 delims =." %% A dalam ('file data wm di mana nama ^ = "% DEST_LATEST: \ = \\%" dapatkan "Terakhir Dimodifikasi"') lakukan (
    jika tidak didefinisikan DEST_FILE_DATE setel DEST_FILE_DATE = %% A)

Gagasan tambahan seputar perbandingan terakhir ini dapat ditemukan di sini: Bagaimana cara membandingkan cap waktu file dalam skrip batch DOS?

Langkah 4 dan 5 : Terakhir, tentukan apakah file terbaru ada di server Source dan salin + ganti nama sesuai kebutuhan.

jika "% SOURCE_FILE_DATE%" gtr "% DEST_FILE_DATE%" (
    REM salin file sumber ke tujuan dan ganti namanya sesuai keinginan.
    salin "% SOURCE_LATEST%" "% DEST_SERVER% \ nama file baru.ext"
) lain (
    REM Tunggu 5 menit dan coba lagi
    batas waktu / T 300
    goto: MULAI
)

Wow, saya menghargai semua upaya yang Anda lakukan dalam hal ini. Ya, Anda memahami pertanyaan itu dengan sempurna. Satu kerutan dalam solusi potensial - saya tidak bisa menyalin file sekitar untuk perbandingan. Server dan workstation berada di jaringan / lokasi berbeda, file agak besar, dan bandwidth terbatas. Apakah akan ada pendekatan lain untuk menghindari penyalinan sampai ditentukan bahwa file di lokasi sumber adalah file terbaru?
Force Flow

Anda dapat menggunakan checksum untuk membandingkan file.
surfasb

@surfasb, checksum akan memberi tahu Anda apakah file-file itu berbeda, tetapi bukan file mana yang lebih baru.

@ ForceFlow Diperbarui dengan perbandingan cap waktu seperti yang diminta, alih-alih memerlukan penyalinan file.

0

Bagaimana dengan file batch berikut

xcopy "\\ Server Sumber \ Jalur Sumber" "c: \ Jalur Tujuan" / C / D / Y

tentu saja tanda "hanya diperlukan jika ada spasi dalam nama.

Ini menggunakan waktu UTC untuk perbandingan. (Waktu Universal Terkoordinasi)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.