删除超过(x)天的文件?

删除超过(x)天的文件?

什么是好的 Windows 命令行选项,用于删除给定文件夹中超过(n)天的所有文件?

还要注意,这些文件可能有数千个,因此forfiles使用 shellcmd并不是一个好主意……除非你喜欢生成数千个命令 shell。我认为这是一种非常恶劣的黑客行为,所以让我们看看我们是否可以做得更好!

理想情况下,某些内容应内置于(或易于安装于)Windows Server 2008 中。

答案1

我又看了看周围找到了 powershell 方法

从指定文件夹中删除所有超过 8 天的文件(带预览)

dir |? {$_.CreationTime -lt (get-date).AddDays(-8)} | del -whatif

(删除 -whatif 即可实现)

答案2

喜欢 Jeff 的 PowerShell 命令,但对于没有 PowerShell 的 Windows 机器的替代 vbs 解决方案,您可以尝试以下操作。

另存为<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 天

注:这是 Haidong Ji 的剧本的修改版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

答案3

不是真正的命令行,但我喜欢使用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);

答案4

使用 cygwin 的(或其他替代)“find”命令可以实现类似的效果。但这需要您安装 cygwin 或手头有便携版本。

相关内容