删除早于(x)天的文件?


31

Windows命令行选项在删除(n)天之前的给定文件夹中的所有文件时,有什么好的Windows命令行选项?

另请注意,其中可能有成千上万个这样的文件,因此在此处forfiles使用shell to cmd不是一个好主意。除非您喜欢生成数千个命令shell。我认为这是一个令人讨厌的骇客,所以让我们看看我们能否做得更好!

理想情况下,Windows Server 2008中内置(或易于安装)的东西。


2
:总部设在.bat文件的新方法使用内部CMD.EXE命令只已经张贴在这里stackoverflow.com/questions/9746778/...

Answers:


43

我四处张望,发现了一种Powershell方式

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

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

(删除-whatif使其实现)


1
要确认,这是否会永久删除文件或将其回收?
TimS

操作太难记住了!我喜欢powershell,但我认为更好的方法是使用robocopy
AminM 2014年

7

喜欢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天之前的所有文件

注意:这是SQLServerCentral.comHaidong Ji脚本的修改版本

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

我使用类似的方法删除旧的Web服务器日志。表现很好。
jeffspost

4

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

Linq真的很棒,我希望将它引入PowerShell。
泰勒·吉布


3

用cygwin(或其他替代方法)的“ find”命令可以实现类似的效果。但是,这将需要您安装cygwin或准备好便携式版本。



2

我使用autoIT在我的系统上完成此操作。我喜欢您可以轻松地将.au3文件编译为exe。引入安全漏洞并不像任何人都可以编辑的bat文件那样容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.