"Hapus File yang Lebih Tua Dari" Skrip Batch

8

Jadi dalam pekerjaan melakukan backup, saya memerlukan skrip batch yang memungkinkan saya untuk menghapus file dalam direktori tertentu, yang lebih tua dari katakanlah, 3 hari. Skrip ini akan ditetapkan sebagai tugas terjadwal untuk dijalankan pada waktu yang ditentukan setiap hari.

Chiggins
sumber
Apakah Anda terikat batch? Bagaimana dengan PowerShell?
Nate
Powershell harus bisa bekerja, saya hanya terbiasa dengan batch dan saya belum pernah bermain dengan Powershell.
Chiggins

Jawaban:

8

Jika PowerShell dapat diterima (seharusnya, seperti yang diaktifkan secara default pada Server 2008+) coba ini:

$numberOfDays = 3
$Now = Get-Date
$TargetFolder = “C:\myoldfiles”
$LastWrite = $Now.AddDays(-$numberOfDays)
$Files = get-childitem $TargetFolder -include *.bak, *.x86 -recurse | Where {$_.LastWriteTime -le “$LastWrite”} 

foreach ($File in $Files)
{
    write-host “Deleting File $File” -foregroundcolor “Red”;
    Remove-Item $File | out-null
} 

Souce di sini .

Nate
sumber
2
+1. Juga, untuk tujuan pengujian Anda dapat menambahkan "-whatif" flag: Remove-Item $File -whatif | out-null. Untuk dijalankan sebagai tugas sched, pekerjaan tersebut harus menentukan path lengkap ke powershell.exe dengan skrip Anda dinamai argumen.
AndyN
Saya datang dengan solusi yang sama untuk memulai - tetapi mengalami masalah dengan beban memori yang terkait dengan mendapatkan semua file di depan.
Tim Barrass
13
forfiles -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

Di mana -5usia file yang ingin Anda hapus (5 hari atau lebih tua dalam hal ini). Script ini sedang menghapus .rarfile - jatuhkan -m *.rarjika Anda ingin menghapus semua jenis file.

Mark Henderson
sumber
1
Dari semua jawaban ini, inilah satu-satunya (sejauh ini) yang langsung menjawab pertanyaan.
John Gardeniers
3

Jika Anda bersikeras menggunakan file batch, Robocopy.exe adalah jawaban Anda. Ini cepat (multithreaded) dan sangat kuat. Untuk skenario Anda, Anda dapat menggunakan yang berikut ini sebagai panduan:

:: Moves dir & files older than 3 days to i:\Destination
:: Wildcards acceptable
robocopy i:\Source\ i:\Destination\ /MOVE /MIR /MINAGE:3 /ETA
:: Removes the destination tree
rd /s /q i:\destination

Ada daftar panjang opsi, silakan lakukan robocopy /? untuk melihat semuanya. Anda bahkan dapat menggunakannya untuk melakukan backup inkremental, penjadwalan, membuat profil cadangan, dll.

Dharma Leonardi
sumber
Semua +1 untuk robocopy! <3 Berikan contoh Anda: Saya tidak yakin apakah sakelar / MIR tepat untuk situasi ini, / MOVE harus menangani pertanyaan Chiggins. Satu hal yang pasti, robocopy memiliki banyak pilihan, diperlukan pemeriksaan yang cermat.
JamesCW
2

Saya suka menggunakan DelEn.exe untuk ini.

Delen - DELete ENhanced - adalah versi DEL yang lengkap. Ini mendukung wildcard dan direktori induk yang diperluas, serta filter tanggal, waktu dan ukuran. File dapat dikecualikan dari penghapusan.

jftuga
sumber
2

Anda mungkin melihat DelAge32 milik Horst Schaeffer:

http://home.mnet-online.de/horst.muc/wbat32.htm#top

DelAge32 - ver. 2.3 (c) 2003-2008, Horst Schaeffer
Deletes or moves files (path with file pattern) by age (number of days)
Syntax:  DelAge32 filespec age [options]
Options:
  /created /accessed /modified (default) - file stamp used to evaluate age
  /includeRO - include read-only files
  /includeH  - include hidden files
  /includeS  - include system files
  /includeRHS -include read-only, hidden and system files
  /recurse   - include subdirectories
  /subonly   - /recurse excluding initial directory
  /rd        - remove empty subdirectories
  /move path - move files to specified path
  /preview   - list, but no action
  /quiet     - no output

Perintah Anda bisa sesederhana:

delage32.exe c:\logdirectory\*.log 3

Saya memiliki perintah ini berjalan sebagai tugas yang dijadwalkan.

RobW
sumber
Ini ditandai sebagai ancaman di Cylance.
Minggu
Delage32.exe Mendapat peringkat 0/53 di virustotal.com, di mana nol berarti tidak ada ancaman yang terdeteksi di antara 53 alat AV teratas. Anda mungkin ingin mengubah AV Anda menjadi sesuatu yang lebih umum.
RobW
Itu bukan pilihan saya. Saya hanya memperingatkan bagi siapa saja yang menggunakan Cylance untuk menghapus delage32 atau menggunakan forfiles
Sun
1

Ini adalah skrip PowerShell yang saya tulis untuk melakukan apa yang Anda inginkan - ia melakukan sedikit lebih banyak juga. Saya menggunakannya untuk menghapus log dan file sementara lainnya.

purge-dem-logs.cmd

powershell.exe -command "& 'c:\purgelogs\purgelogs.ps1' -Filepath D:\SQL\backup\ -filemask *.bak -Maxdays 14 "

purgelogs.ps1:

Param ($filepath, $filemask, $maxdays, [switch]$recurse)

   if (($FilePath -eq $null) -or ($FileMask -eq $null) -or ($MaxDays -eq $null)) {
      write-host "Usage .\purgelogs.ps1 -filepath [Path] -filemask [Mask] -masdays [Max Days]"
      write-host " "
      write-host "Example: "
      write-host "    .\purgelogs.ps1 -filepath c:\temp -filemask *.log -maxdays 30"
      break
      }

   if (Test-Path $FilePath) {

      $FilePath += "*"

      $Now = Get-Date

      $LastWrite = $Now.AddDays(-$MaxDays)

      write-host "Last write time " $LastWrite
      if ($recurse) {
         $Files = get-childitem $FilePath -include $FileMask -recurse | Where {$_.LastWriteTime -le "$LastWrite"}
      } else {
         $Files = get-childitem $FilePath -include $FileMask | Where {$_.LastWriteTime -le "$LastWrite"}
      }

      if ($Files -eq $null) {

         write-host "No matching files found"

      } else {

          foreach ($File in $Files)
            #You can add -whatif to see the consequence û Remove-item $File -Whatif
            {
            write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
            }
         }
      }
   Else
      {
      Write-Host "The Folder $FilePath Does Not Exist!"
      }
Ian Murphy
sumber
1

Ini tidak akan berfungsi untuk komputer jarak jauh. Admin perlu mengelola banyak komputer. Di bawah ini adalah skrip yang dapat digunakan untuk menghapus folder di banyak komputer jarak jauh tanpa harus login ke sana.

Skrip di bawah ini akan menghapus folder yang lebih dari 15 hari. Anda dapat mengubah parameter $ hari.

D $ \ Program Files (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs adalah jalur UNC untuk folder Blackberry Log. Anda dapat mengubah direktori tempat log / folder Anda berada.

Daftar semua nama server Anda dalam file servers.txt dan itu harus terletak di direktori yang sama dengan skrip ini

cd C:\Scripts\Powershellscripts\deletefiles ----> change it to the directory you wanna out this script to

$Days = "15" 
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$server = get-content servers.txt
foreach ($node in $server)
{
get-childitem -recurse "\\$node\D$\Program Files (x86)\Research In Motion\BlackBerry Enterprise Server\Logs" | Where-Object {$_.LastWriteTime -le $LastWrite} | remove-item -recurse -force
}

Simpan skrip sebagai .ps1 dan jalankan. Anda dapat menjadwalkannya melalui file batch. Dengan begitu Anda perlu menambahkan perintah Ubah Direktori di awal skrip.

Selamat bersenang-senang.

VJ Kumar
sumber
0

Sebagai pendekatan alternatif: alih-alih mengandalkan permintaan sistem file untuk mendapatkan waktu pembuatan file (dan memukul file yang sama selama beberapa hari, sampai habis), Anda bisa menambahkan file ke indeks Anda sendiri pada saat pembuatan. Indeks berpotensi menjadi sesederhana file bernama setelah tanggal pembuatan, disimpan di lokasi yang diketahui, dengan file per baris.

Jika Anda memiliki file aplikasi multithreaded / multi-proses, maka Anda mungkin ingin indeks Anda ditangani dengan cara yang lebih canggih.

Keuntungannya adalah bahwa Anda selalu memiliki daftar file yang relatif diproses sederhana yang dibuat pada hari tertentu yang dapat Anda ulangi, daripada harus bertanya pada sistem file berulang kali untuk detailnya.

(Ini akan bergantung pada aplikasi, dan pembuatan file, dikelola oleh Anda, dan bukan oleh pihak ketiga).

Tim Barrass
sumber