Какой хороший вариант командной строки Windows для удаления всех файлов в данной папке старше (n) дней?
Также обратите внимание, что таких файлов может быть много тысяч, поэтому forfiles
с оболочкой, чтобы cmd
здесь не лучшая идея ... если вам не нравится создавать тысячи командных оболочек. Я считаю, что это довольно неприятный прием, так что давайте посмотрим, сможем ли мы сделать лучше!
В идеале что-то встроенное (или легко устанавливаемое) в Windows Server 2008.
Я еще немного огляделся и нашел способ PowerShell:
Удалить все файлы старше 8 дней из указанной папки (с предварительным просмотром)
dir |? {$_.CreationTime -lt (get-date).AddDays(-8)} | del -whatif
(удалите -whatif, чтобы это произошло)
Люблю команду Джеффа PowerShell, но для альтернативного решения vbs для машин Windows без PowerShell вы можете попробовать следующее.
Сохранить как <filename>.vbs
и выполните:
<filename>.vbs <target_dir> <NoDaysSinceModified> [Action]
Третий параметр, [Action]
не является обязательным. Без него файлы старше <NoDaysSinceModified>
будут перечислены. С его установленным как D
он удалит файлы старше <NoDaysSinceModified>
пример
PurgeOldFiles.vbs "c:\Log Files" 8
воля список все файлы в c:\Log Files
старше 8 дней
PurgeOldFiles.vbs "c:\Log Files" 8 D
воля Удалить все файлы в c:\Log Files
старше 8 дней
примечание: это модифицированная версия сценария Хайдон Джи на SQLServerCentral.com
Option Explicit
on error resume next
Dim oFSO
Dim sDirectoryPath
Dim oFolder
Dim oFileCollection
Dim oFile
Dim iDaysOld
Dim fAction
sDirectoryPath = WScript.Arguments.Item(0)
iDaysOld = WScript.Arguments.Item(1)
fAction = WScript.Arguments.Item(2)
Set oFSO = CreateObject("Scripting.FileSystemObject")
set oFolder = oFSO.GetFolder(sDirectoryPath)
set oFileCollection = oFolder.Files
If UCase(fAction) = "D" Then
'Walk through each file in this folder collection.
'If it is older than iDaysOld, then delete it.
For each oFile in oFileCollection
If oFile.DateLastModified < (Date() - iDaysOld) Then
oFile.Delete(True)
End If
Next
else
'Displays Each file in the dir older than iDaysOld
For each oFile in oFileCollection
If oFile.DateLastModified < (Date() - iDaysOld) Then
Wscript.Echo oFile.Name & " " & oFile.DateLastModified
End If
Next
End If
'Clean up
Set oFSO = Nothing
Set oFolder = Nothing
Set oFileCollection = Nothing
Set oFile = Nothing
Set fAction = Nothing
Не совсем командная строка, но мне нравится использовать LINQPad в качестве хоста сценариев C #:
(который только что дал мне идею создания сценариев командной строки C # для файлов vbs)
var files = from f in Directory.GetFiles(@"D:\temp", "*.*", SearchOption.AllDirectories)
where File.GetLastWriteTime(f) < DateTime.Today.AddDays(-8)
select f;
foreach(var f in files)
File.Delete(f);
Посмотри на это http://sourceforge.net/projects/delold поскольку это то, что я использую.
просто, но работает. delold -d 14 Удаляет файлы старше 14 дней в текущей папке.
Нечто подобное может быть достигнуто с помощью команды cygwin (или другой альтернативы) "find". Но для этого вам потребуется установить cygwin или иметь под рукой портативную версию.
Еще одна альтернатива, которую я использовал до Powershell:
http://lifehacker.com/133190/geek-to-live--hard-drive-janitor
Я использую autoIT для этого в своих системах. Мне нравится, что вы можете легко компилировать файлы .au3 в exe. Не так просто ввести брешь в безопасности, как с файлом bat, который может редактировать кто угодно.