「より古いファイルを削除する」バッチスクリプト


8

したがって、バックアップを実行する作業で、指定したディレクトリ内で、たとえば3日間よりも古いファイルを削除できるバッチスクリプトが必要です。このスクリプトは、毎日指定された時刻に実行されるようにスケジュールされたタスクとして設定されます。


あなたはバッチに縛られていますか?powershellはどうですか?
ネイト

Powershellが機能するはずです。私はバッチ処理に慣れているだけで、Powershellを使用したことがありません。
Chiggins

回答:


8

powershellが許容できる場合(サーバー2008以降ではデフォルトで有効になっているはずです)、これを試してください:

$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
} 

ここにソース。


2
+1。また、テストの目的で、「-whatif」フラグを追加できます Remove-Item $File -whatif | out-null。スケジュールされたタスクとして実行するには、ジョブは引数として名前が付けられたスクリプトを使用してpowershell.exeへの完全パスを指定する必要があります。
AndyN

私は最初に同じ解決策を思いつきました-しかし、すべてのファイルを前もって取得することに関連するメモリ負荷の問題に遭遇しました。
Tim Barrass、2015年

13
forfiles -pc:\ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

-5削除するファイルの経過日数はどこですか(この場合は5日以上)。このスクリプトは.rarファイルを削除しています- -m *.rarファイルの種類を削除したい場合はを削除してください。


1
これらすべての回答の中で、これは質問に直接回答する唯一の回答です(これまでのところ)。
John Gardeniers、2012

3

バッチファイルを使用する場合は、Robocopy.exeが最適です。その高速(マルチスレッド)で非常に堅牢です。シナリオでは、以下をガイドとして使用できます。

:: 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

オプションの長いリストがあります。robocopy/?を実行してください。それらすべてを見るために。増分バックアップ、スケジュール設定、バックアッププロファイルの作成などにも使用できます。


robocopyのすべての+1!<3あなたの例について:/ MIRスイッチがこの状況に適しているかどうかはわかりませんが、/ MOVEがChigginsの質問に対処する必要があります。確かに、robocopyにはたくさんのオプションがあり、慎重な検査が必要です。
JamesCW

2

これにはDelEn.exeを使用します。

Delen-DELete ENhanced-はDELのスープバージョンです。拡張ワイルドカードと親ディレクトリ、日付、時刻、サイズのフィルタをサポートしています。ファイルを削除から除外できます。


2

Horst SchaefferのDelAge32をご覧ください。

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

コマンドは次のように簡単にすることができます。

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

このコマンドをスケジュールされたタスクとして実行しています。


これはCylanceで脅威としてフラグが付けられます。

Delage32.exeはvirustotal.comで0/53の評価を獲得しています。0は上位53のAVツールで脅威が検出されなかったことを意味します。AVをより主流に変更したい場合があります。
RobW 2016

それは私の選択ではありません。Cylanceを使用してdelage32を放棄するか、forfilesを使用するすべての人に警告を発します
Sun

1

これは私があなたがしたいことをするために書いたPowershellスクリプトです-それはもう少しします。ログやその他の一時ファイルをクリアするために使用します。

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!"
      }

1

これはリモートコンピュータでは機能しません。管理者は複数のコンピュータを管理する必要があります。以下は、複数のリモートコンピューターのフォルダーにログインせずにそれらを削除するために使用できるスクリプトです。

以下のスクリプトは、15日より古いフォルダーを削除します。$ daysパラメータを変更することもできます。

D $ \ Program Files(x86)\ Research In Motion \ BlackBerry Enterprise Server \ Logsは、Blackberry LogフォルダーのUNCパスです。ログ/フォルダがあるディレクトリを変更できます。

servers.txtファイルにすべてのサーバー名をリストします。このスクリプトと同じディレクトリに配置する必要があります。

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
}

スクリプトを.ps1として保存して実行します。バッチファイルでスケジュールできます。この方法では、スクリプトの最初にChange Directoryコマンドを追加する必要があります。

楽しんで。


0

別のアプローチとして:ファイル作成時間を取得するためにファイルシステムのクエリに頼るのではなく(および、有効期限が切れるまで数日にわたって同じファイルをヒットする)、作成時にファイルを独自のインデックスに追加できます。インデックスは、作成日にちなんで名前が付けられ、既知の場所に1行に1ファイルずつ保存されたファイルと同じくらい単純なものになる可能性があります。

ファイルを作成するマルチスレッド/マルチプロセスアプリがある場合は、インデックスをより洗練された方法で処理する必要があります。

利点は、特定の日に作成された比較的単純に処理されたファイルのリストが常にあり、詳細についてファイルシステムに何度も問い合わせる必要がないことです。

(これはアプリとファイルの作成に依存し、サードパーティではなく、あなたが管理します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.