Пакетный скрипт «Удалить файлы старше, чем»

8

Поэтому в процессе создания резервных копий мне нужен пакетный скрипт, который позволил бы мне удалять файлы в указанном каталоге, которые старше, чем, скажем, на 3 дня. Этот сценарий будет установлен как запланированное задание для запуска в указанное время каждый день.

Chiggins
источник
Вы привязаны к партии? Как насчет powershell?
Nate
Powershell должен быть в состоянии работать, я просто привык, и я никогда не играл с Powershell.
Чиггинс

Ответы:

8

Если PowerShell является приемлемым (должно быть, так как он включен по умолчанию на Server 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
} 

Соус здесь .

Nate
источник
2
+1. Кроме того , для целей тестирования вы можете добавить «-whatif» флаг: Remove-Item $File -whatif | out-null. Для запуска в качестве задачи планирования в задании должен быть указан полный путь к powershell.exe с вашим сценарием в качестве аргумента.
AndyN
Я начал с того же решения, но столкнулся с проблемами с загрузкой памяти, связанной с получением всех файлов заранее.
Тим Баррасс
13
forfiles -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

Где указан -5возраст файлов, которые вы хотите удалить (в данном случае 5 дней или более). Этот скрипт удаляет .rarфайлы - удалите, -m *.rarесли вы хотите удалить любой тип файла.

Марк Хендерсон
источник
1
Из всех этих ответов это единственный (пока), который прямо отвечает на вопрос.
Джон Гарденье
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 /? чтобы увидеть их всех. Вы даже можете использовать его для создания инкрементных резервных копий, планирования, создания профилей резервного копирования и т. Д.

Дхарма Леонарди
источник
Все +1 для робокопии! <3 В качестве примера: я не уверен, что ключ / MIR подходит для этой ситуации, / MOVE должен решить вопрос Чиггинса. Одно можно сказать наверняка, у robocopy есть куча вариантов, требуется тщательный осмотр.
JamesCW
2

Мне нравится использовать DelEn.exe для этого.

Delen - DELete ENhanced - это усовершенствованная версия DEL. Он поддерживает расширенные шаблоны и родительские каталоги, а также фильтры даты, времени и размера. Файлы могут быть исключены из удаления.

jftuga
источник
2

Вы можете посмотреть на 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

У меня эта команда работает как запланированная задача.

RobW
источник
В Cylance это помечается как угроза.
вс
Delage32.exe Получает рейтинг 0/53 на virustotal.com, где ноль означает отсутствие угроз среди 53 лучших AV-инструментов. Возможно, вы захотите изменить свой AV на что-то более массовое.
RobW
Это не мой выбор. Я просто предупреждаю всех, кто использует Cylance, чтобы либо отказаться от delage32, либо использовать forfiles
Sun
1

Это сценарий PowerShell, который я написал, чтобы делать то, что вы хотите - он тоже делает немного больше. Я использую его для очистки журналов и других временных файлов.

продувка-дем-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 - это UNC-путь для папки Blackberry Log. Вы можете изменить каталог, в котором расположены ваши журналы / папки.

Перечислите все имена ваших серверов в файле 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 и запустите его. Вы можете запланировать это через пакетный файл. Таким образом, вам нужно добавить команду Изменить каталог в начале скрипта.

Радоваться, веселиться.

VJ Кумар
источник
0

В качестве альтернативного подхода: вместо того, чтобы полагаться на файловую систему для получения времени создания файла (и попадания в одни и те же файлы в течение нескольких дней, пока не истечет срок их действия), вы можете добавить файл в собственный индекс во время создания. Индекс может потенциально быть таким же простым, как файл, названный в честь даты создания, хранящийся в известном месте, с файлом в каждой строке.

Если у вас есть многопоточное / многопроцессорное приложение, создающее файлы, то вы, возможно, захотите, чтобы ваш индекс обрабатывался более изощренным способом.

Преимущество состоит в том, что у вас всегда есть относительно простой список файлов, созданный в определенный день, который вы можете перебирать, вместо того, чтобы спрашивать файловую систему снова и снова о деталях.

(Это будет зависеть от приложения и создания файла, управляемого вами, а не третьей стороной).

Тим Баррасс
источник