Saya mencari cara untuk menghapus semua file yang lebih lama dari 7 hari dalam file batch. Saya telah mencari di seluruh web, dan menemukan beberapa contoh dengan ratusan baris kode, dan yang lainnya yang memerlukan menginstal utilitas baris perintah tambahan untuk menyelesaikan tugas.
Hal serupa dapat dilakukan dalam BASH hanya dalam beberapa baris kode. Tampaknya sesuatu yang paling tidak mudah dapat dilakukan untuk file batch di Windows. Saya mencari solusi yang bekerja di command prompt standar Windows, tanpa utilitas tambahan. Harap tidak ada PowerShell atau Cygwin.
Jawaban:
Nikmati:
Lihat
forfiles
dokumentasi untuk lebih jelasnya.Untuk lebih banyak barang, lihat Indeks AZ pada baris perintah Windows XP .
Jika Anda belum
forfiles
menginstal pada mesin Anda, salin dari Windows Server 2003 ke mesin Windows XP di%WinDir%\system32\
. Ini dimungkinkan karena EXE sepenuhnya kompatibel antara Windows Server 2003 dan Windows XP.Versi Windows dan Windows Server yang lebih baru telah menginstalnya secara default.
Untuk Windows 7 dan yang lebih baru (termasuk Windows 10):
Sintaksnya sedikit berubah. Oleh karena itu perintah yang diperbarui adalah:
sumber
Jalankan perintah berikut :
Pindahkan semua file (menggunakan / mov, yang memindahkan file dan kemudian menghapusnya sebagai lawan dari / memindahkan yang memindahkan seluruh file yang kemudian dihapus) melalui robocopy ke lokasi lain, dan kemudian jalankan perintah delete pada path itu dan Anda semua baik.
Juga jika Anda memiliki direktori dengan banyak data di dalamnya Anda dapat menggunakan
/mir
sakelarsumber
rd /s /q c:\destination
alih-alihdel
perintah meskipun atau bahkan menggunakanrobocopy /mir c:\emptydir c:\destination
menjalankan lain untuk mengosongkan direktori jika Anda mengharapkan masalah dengan nama file.forfiles
dari jawaban yang diterima tidak akan berhasil.C:\test
lebih dari 7 hari. Untuk menghapus file, ubahecho
kedel
:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
Ok bosan sedikit dan muncul dengan ini, yang berisi versi saya tentang penggantian zaman Linux orang miskin terbatas untuk penggunaan sehari-hari (tidak ada waktu retensi):
7daysclean.cmd
PEMAKAIAN
set /a strip=day*7
: Ubah 7 untuk jumlah hari yang akan disimpan.set dSource=C:\temp
: Ini adalah direktori awal untuk memeriksa file.CATATAN
Ini adalah kode non-destruktif, itu akan menampilkan apa yang akan terjadi.
Ubah:
untuk sesuatu seperti:
jadi file sebenarnya bisa dihapus
Februari : hard-coded menjadi 28 hari. Tahun-tahun Bissextile adalah neraka untuk ditambahkan, sungguh. jika seseorang memiliki ide yang tidak akan menambahkan 10 baris kode, silakan dan posting jadi saya menambahkannya ke kode saya.
zaman : Saya tidak mempertimbangkan, karena kebutuhan untuk menghapus file yang lebih tua dari tanggal tertentu, mengambil jam / menit akan menghapus file dari hari yang dimaksudkan untuk disimpan.
BATASAN
zaman menerima begitu saja format tanggal pendek Anda adalah YYYY-MM-DD. Ini perlu disesuaikan untuk pengaturan lain atau evaluasi run-time (baca sShortTime, konfigurasi yang terikat pengguna, konfigurasikan urutan bidang yang tepat dalam filter dan gunakan filter untuk mengekstrak data yang benar dari argumen).
Apakah saya menyebutkan saya benci formating otomatis editor ini? menghapus garis kosong dan copy-paste adalah neraka.
Saya harap ini membantu.
sumber
7daysclean.cmd
terdengar seperti nama yang luar biasa untuk band Synth-Punk.Anda harus melakukannya
/d -3
(3 hari sebelumnya) Ini berfungsi dengan baik untuk saya. Jadi semua kumpulan rumit bisa berada di tempat sampah. Jugaforfiles
tidak mendukung jalur UNC, jadi buat koneksi jaringan ke drive tertentu.sumber
*.*
berasal? Wildcard*.*
tidak cocok dengan semua file di Windows. Itu hanya cocok dengan file dengan.
nama mereka. OP tidak pernah mengatakan apa-apa tentang keharusan.
dalam nama file. Parameter yang tepat adalah/M *
, tetapi ini adalah standarnya. Tidak perlu/M
sama sekali.*.*
berperilaku persis seperti*
di Windows. Bahkan, saya baru mencobanya di komputer saya, dandir *.*
memang terdaftartest file
, file tanpa ekstensi.*.*
tidak konsisten antara, katakanlah,dir
dan-m
opsiforfiles
. The-m *.*
mask memang akan melewatkan nama file extensionless, seperti yang saya nyatakan dalam komentar saya di atas (mencobanya sendiri). Bagian yang lucu di sini adalah bahwa dokumentasi MS secara eksplisit menyatakan itu-m *.*
adalah default. Namun, jika Anda mencobanya dalam kehidupan nyata, Anda akan melihat bahwa default-nya sebenarnya-m *
- semua file diulang.*.*
topeng diterapkan ke semua file. Pertanyaan retoris saya tentang "kebiasaan aneh ini" memang tidak masuk akal, karena memperlakukan*.*
dan*
setara adalah konvensi lama Windows. Namun,/m
opsi dalamforfiles
kebetulan melanggar konvensi itu untuk beberapa alasan.Lihat jawaban saya untuk pertanyaan serupa :
Ini menghapus file yang lebih lama dari tanggal yang ditentukan. Saya yakin ini dapat dimodifikasi untuk kembali tujuh hari dari tanggal saat ini.
pembaruan: Saya perhatikan bahwa HerbCSO telah meningkat pada skrip di atas. Saya sarankan menggunakan versinya .
sumber
Perintah saya adalah
@PATH
- hanya jalan dalam kasus saya, jadi saya harus menggunakan@PATH\@FILE
juga
forfiles /?
tidak bekerja untuk saya juga, tetapiforfiles
(tanpa "?") berfungsi dengan baik.Dan satu-satunya pertanyaan yang saya miliki: bagaimana cara menambahkan banyak topeng (misalnya " .log | .bak")?
Semua ini mengenai forfiles.exe yang saya unduh di sini (pada win XP)
Tetapi jika Anda menggunakan server Windows forfiles.exe harus sudah ada dan berbeda dari versi ftp. Itu sebabnya saya harus memodifikasi perintah.
Untuk Windows Server 2003 saya menggunakan perintah ini:
sumber
Sering ada pertanyaan terkait tanggal / waktu relatif untuk diselesaikan dengan file batch. Tetapi interpreter command line cmd.exe tidak memiliki fungsi untuk perhitungan tanggal / waktu. Banyak solusi yang berfungsi baik menggunakan aplikasi konsol tambahan atau skrip telah diposting di sini, di halaman lain dari Stack Overflow dan di situs web lain.
Umum untuk operasi berdasarkan tanggal / waktu adalah persyaratan untuk mengubah string tanggal / waktu menjadi detik sejak hari yang ditentukan. Sangat umum adalah 1970-01-01 00:00:00 UTC. Tetapi hari berikutnya dapat juga digunakan tergantung pada rentang tanggal yang diperlukan untuk mendukung tugas tertentu.
Jay memposting 7daysclean.cmd yang berisi solusi cepat "date to seconds" untuk penerjemah baris perintah cmd.exe . Tapi itu tidak mengambil tahun kabisat diperhitungkan. JR memposting add-on untuk memperhitungkan hari kabisat di tahun berjalan, tetapi mengabaikan tahun kabisat lainnya sejak tahun dasar, yaitu sejak tahun 1970.
Saya menggunakan sejak 20 tahun tabel statis (array) dibuat sekali dengan fungsi C kecil untuk dengan cepat mendapatkan jumlah hari termasuk hari kabisat dari 1970-01-01 dalam fungsi konversi tanggal / waktu dalam aplikasi saya yang ditulis dalam C / C ++.
Metode tabel yang sangat cepat ini dapat digunakan juga dalam kode batch menggunakan perintah FOR . Jadi saya memutuskan untuk membuat kode subrutin batch
GetSeconds
yang menghitung jumlah detik sejak 1970-01-01 00:00:00 UTC untuk string tanggal / waktu yang diteruskan ke rutin ini.Catatan: Kabisat detik tidak diperhitungkan karena sistem file Windows juga tidak mendukung detik kabisat.
Pertama, tabel:
Hari sejak 1970-01-01 00:00:00 UTC untuk setiap tahun termasuk hari kabisat.
Menghitung detik untuk tahun 2039 hingga 2106 dengan zaman mulai 1970-01-01 hanya mungkin dengan menggunakan variabel 32-bit yang tidak ditandai, yaitu panjang yang tidak ditandatangani (atau int tidak ditandatangani) di C / C ++.
Tapi cmd.exe digunakan untuk ekspresi matematika, variabel 32-bit yang ditandatangani. Oleh karena itu nilai maksimum adalah 2147483647 (0x7FFFFFFF) yaitu 2038-01-19 03:14:07.
Informasi tahun kabisat (Tidak / Ya) untuk tahun 1970 hingga 2106.
Jumlah hari hingga hari pertama setiap bulan pada tahun berjalan.
Mengonversi tanggal ke jumlah detik sejak 1970-01-01 cukup mudah menggunakan tabel tersebut.
Tolong perhatiannya!
Format string tanggal dan waktu tergantung pada pengaturan wilayah dan bahasa Windows. Pembatas dan urutan token yang ditetapkan ke variabel lingkungan
Day
,Month
danYear
pada loop FOR pertamaGetSeconds
harus disesuaikan dengan format tanggal / waktu lokal jika perlu.Diperlukan untuk mengadaptasi string tanggal dari variabel lingkungan jika format tanggal dalam variabel lingkungan DATE berbeda dengan format tanggal yang digunakan oleh perintah FOR pada
%%~tF
.Misalnya ketika
%DATE%
mengembang keSun 02/08/2015
sementara%%~tF
mengembang ke02/08/2015 07:38 PM
kode di bawah ini dapat digunakan dengan memodifikasi baris 4 ke:Ini menghasilkan passing ke subrutin saja
02/08/2015
- string tanggal tanpa 3 huruf singkatan hari kerja dan karakter spasi yang terpisah.Sebagai alternatif, berikut dapat digunakan untuk melewati tanggal saat ini dalam format yang benar:
Sekarang 10 karakter terakhir dari string tanggal diteruskan ke fungsi
GetSeconds
dan oleh karena itu tidak masalah jika string tanggal dari variabel lingkungan DATE adalah dengan atau tanpa hari kerja selama hari dan bulan selalu dengan 2 digit dalam urutan yang diharapkan, yaitu dalam formatdd/mm/yyyy
ataudd.mm.yyyy
.Berikut ini adalah kode batch dengan menjelaskan komentar yang hanya menampilkan file mana yang akan dihapus dan file mana yang harus disimpan dalam
C:\Temp
folder tree, lihat kode loop FOR pertama .Untuk kinerja yang optimal, sebaiknya hapus semua komentar, yaitu semua baris yang dimulai dengan rem setelah 0-4 spasi.
Dan array dapat dibuat juga lebih kecil, yaitu mengurangi rentang waktu dari 1980-01-01 00:00:00 menjadi 2038-01-19 03:14:07 seperti yang saat ini didukung oleh kode batch di atas misalnya ke 2015-01 -01 hingga 2019-12-31 sebagai kode di bawah ini menggunakan yang benar-benar menghapus file yang lebih lama dari 7 hari di
C:\Temp
folder tree.Selanjutnya kode batch di bawah ini dioptimalkan untuk format waktu 24 jam.
Untuk informasi lebih lanjut tentang format tanggal dan waktu dan perbandingan waktu file di Windows lihat jawaban saya di Cari tahu apakah file lebih dari 4 jam dalam file batch dengan banyak informasi tambahan tentang waktu file.
sumber
Salin kode ini dan simpan sebagai
DelOldFiles.vbs
.PENGGUNAAN CMD:
cscript //nologo DelOldFiles.vbs 15
15 berarti menghapus file yang lebih lama dari 15 hari yang lalu.
sumber
Untuk Windows Server 2008 R2:
Ini akan menghapus semua file .sql yang lebih lama dari 90 hari.
sumber
Gunakan forfiles.
Ada beberapa versi berbeda. Yang awal menggunakan parameter gaya unix.
Versi saya (untuk server 2000 - perhatikan tidak ada ruang setelah switch) -
Untuk menambahkan forfile ke XP, dapatkan exe dari ftp://ftp.microsoft.com/ResKit/y2kfix/x86/
dan menambahkannya ke C: \ WINDOWS \ system32
sumber
*.*
inforfiles
tidak cocok dengan semua file. Ini hanya cocok dengan file.
dalam namanya (yaitu file dengan ekstensi). OP tidak pernah mengatakan apa-apa tentang keharusan.
dalam nama file. Parameter yang tepat adalah/M *
, tetapi ini adalah standarnya. Tidak perlu/M
sama sekali.Untuk windows 2012 R2 berikut ini akan berfungsi:
untuk melihat file yang akan dihapus gunakan ini
sumber
IMO, JavaScript berangsur-angsur menjadi standar skrip universal: mungkin tersedia di lebih banyak produk daripada bahasa skrip lain (di Windows, itu tersedia menggunakan Host Scripting Windows). Saya harus membersihkan file lama di banyak folder, jadi di sini adalah fungsi JavaScript untuk melakukannya:
Agar setiap folder dihapus, cukup tambahkan panggilan lain ke fungsi clearFolder (). Kode khusus ini juga memelihara file exe dan dll, dan membersihkan subfolder juga.
sumber
Bagaimana dengan modifikasi ini pada 7daysclean.cmd untuk mengambil satu tahun kabisat?
Ini dapat dilakukan dalam waktu kurang dari 10 baris kode!
Edit oleh Mofi:
Kondisi di atas yang dikontribusikan oleh JR selalu bernilai false karena sintaks yang tidak valid.
Dan
Month GEQ 2
juga salah karena menambahkan 86400 detik untuk satu hari lagi harus dilakukan dalam satu tahun kabisat hanya untuk bulan Maret hingga Desember, tetapi tidak untuk Februari.Kode kerja untuk memperhitungkan hari kabisat - hanya tahun ini - dalam file batch 7daysclean.cmd yang diposting oleh Jay adalah:
sumber
Mungkin saya menambahkan kontribusi sederhana ke utas yang sudah berharga ini. Saya menemukan bahwa solusi lain mungkin menghilangkan teks kesalahan aktual tetapi mengabaikan% ERRORLEVEL% yang menandakan kegagalan dalam aplikasi saya. DAN saya ingin secara sah% ERRORLEVEL% selama itu bukan kesalahan "Tidak ada file yang ditemukan".
Beberapa contoh:
Khusus debugging dan menghilangkan kesalahan:
Menggunakan oneliner untuk mengembalikan keberhasilan atau kegagalan ERRORLEVEL:
Menggunakan oneliner untuk menjaga ERRORLEVEL nol untuk sukses dalam konteks batchfile di tengah-tengah kode lain (ver> nul me-reset ERRORLEVEL):
Untuk langkah pekerjaan SQL Server Agent CmdExec saya mendarat di berikut ini. Saya tidak tahu apakah ini bug, tetapi CmdExec dalam langkah ini hanya mengenali baris kode pertama:
sumber
Astaga, sudah banyak jawaban. Rute sederhana dan nyaman yang saya temukan adalah untuk mengeksekusi ROBOCOPY.EXE dua kali secara berurutan dari satu instruksi baris perintah Windows menggunakan parameter & .
Dalam contoh ini berfungsi dengan memilih semua file ( . ) Yang lebih tua dari 30 hari dan memindahkannya ke folder target. Perintah kedua melakukan hal yang sama lagi dengan penambahan perintah PURGE yang berarti menghapus file di folder target yang tidak ada di folder sumber. Jadi intinya, perintah pertama MOVES file dan DELETES kedua karena mereka tidak ada lagi di folder sumber ketika perintah kedua dipanggil.
Lihat dokumentasi ROBOCOPY dan gunakan sakelar / L saat menguji.
sumber
Jika Anda memiliki kit sumber daya XP, Anda dapat menggunakan robocopy untuk memindahkan semua direktori lama ke satu direktori, lalu gunakan rmdir untuk menghapus satu saja:
sumber
Saya pikir jawaban e.James baik karena ia bekerja dengan versi Windows yang tidak dimodifikasi sedini Windows 2000 SP4 (dan mungkin sebelumnya), tetapi diperlukan penulisan ke file eksternal. Berikut ini adalah versi yang dimodifikasi yang tidak membuat file teks eksternal sambil mempertahankan kompatibilitas:
Agar benar dengan pertanyaan awal, ini ada dalam skrip yang melakukan SEMUA matematika untuk Anda jika Anda menyebutnya dengan jumlah hari sebagai parameter:
CATATAN: Kode di atas memperhitungkan tahun kabisat, serta jumlah hari yang tepat di setiap bulan. Satu-satunya maksimum adalah jumlah hari yang telah ada sejak 0/0/0 (setelah itu menghasilkan tahun negatif).
CATATAN: Matematika hanya berjalan satu arah; itu tidak dapat dengan benar mendapatkan tanggal mendatang dari input negatif (itu akan mencoba, tetapi kemungkinan akan melewati hari terakhir bulan itu).
sumber
Anda mungkin bisa melakukan ini. Anda dapat melihat pada pertanyaan ini , untuk contoh yang lebih sederhana. Kompleksitasnya datang, ketika Anda mulai membandingkan tanggal. Mungkin mudah untuk mengetahui apakah tanggalnya lebih besar atau tidak, tetapi ada banyak situasi yang perlu dipertimbangkan jika Anda harus benar-benar mendapatkan perbedaan antara dua tanggal.
Dengan kata lain - jangan mencoba untuk menciptakan ini, kecuali jika Anda benar-benar tidak dapat menggunakan alat pihak ketiga.
sumber
ini tidak ada yang luar biasa, tetapi saya perlu melakukan sesuatu seperti ini hari ini dan menjalankannya sebagai tugas yang dijadwalkan dll.
file batch, DelFilesOlderThanNDays.bat di bawah ini dengan sampel exec dengan params:
sumber
Memperluas jawaban aku, aku melihat banyak orang bertanya tentang jalur UNC. Cukup memetakan jalur unc ke drive letter akan membuat forfile bahagia. Pemetaan dan unmapping drive dapat dilakukan secara terprogram dalam file batch, misalnya.
Ini akan menghapus semua file dengan ekstensi .gz yang lebih lama dari 7 hari. Jika Anda ingin memastikan Z: tidak dipetakan ke hal lain sebelum menggunakannya, Anda bisa melakukan sesuatu yang sederhana
sumber
ROBOCOPY bekerja sangat baik untuk saya. Awalnya menyarankan Iman saya. Tetapi alih-alih memindahkan file / folder ke direktori sementara lalu menghapus isi folder sementara, pindahkan file ke tempat sampah !!!
Ini adalah beberapa baris file batch cadangan saya misalnya:
Ini membersihkan apa pun yang lebih tua dari 15 hari dari folder 'Temp' saya dan 30 hari untuk apa pun di folder cadangan AutoCAD saya. Saya menggunakan variabel karena garisnya bisa cukup panjang dan saya bisa menggunakannya kembali untuk lokasi lain. Anda hanya perlu menemukan path dos ke recycle bin Anda yang terkait dengan login Anda.
Ini ada di komputer kerja untuk saya dan berhasil. Saya memahami bahwa beberapa dari Anda mungkin memiliki hak yang lebih ketat tetapi tetap mencobanya;) Cari Google untuk penjelasan tentang parameter ROBOCOPY.
Bersulang!
sumber
Skrip saya untuk menghapus file yang lebih lama dari tahun tertentu:
sumber
Yang ini melakukannya untuk saya. Ini berfungsi dengan tanggal dan Anda dapat mengurangi jumlah yang diinginkan dalam beberapa tahun untuk kembali ke masa:
yang
/F
dicmd /c del @path /F
pasukan file tertentu yang akan dihapus dalam beberapa kasus file dapat read-only.itu
dateYear
adalah tahun Variabel dan di sana Anda dapat mengubah pengurangan sesuai dengan kebutuhan Anda sendirisumber