“删除文件早于”批处理脚本


8

因此,在进行备份的过程中,我需要一个批处理脚本,该脚本允许我删除指定目录中的文件(比说的要早3天)。该脚本将被设置为计划任务,每天在指定时间运行。


你被捆绑在一起吗?那么powershell呢?
Nate

Powershell应该能够工作,我只是习惯于批处理,而我从未使用过Powershell。
Chiggins 2011年

Answers:


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
} 

在这里喝。


2
+1。另外,出于测试目的,您可以添加“ -whatif”标志: Remove-Item $File -whatif | out-null。要作为预定任务运行,该作业应使用您的脚本作为参数指定powershell.exe的完整路径。
2011年

我最初提出了相同的解决方案-但是遇到了与使所有文件预先存储相关的内存负载问题。
蒂姆·巴拉斯

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应该解决希金斯的问题。可以肯定的是,robocopy有很多选择,需要仔细检查。
JamesCW 2012年

2

我喜欢为此使用DelEn.exe

Delen-DELete增强-是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等级,其中零表示在前53个AV工具中未检测到威胁。您可能需要将AV更改为更主流的内容。
RobW

这不是我的选择。我只是警告对于使用Cylance要么弃权delage32或使用FORFILES人
太阳

1

这是我编写的Powershell脚本,可以执行您想要的操作-它的功能也更多。我用它来清除日志和其他临时文件。

清除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)\ 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并运行它。您可以通过批处理文件计划它。这样,您需要在脚本的开头添加“更改目录”命令。

玩得开心。


0

作为一种替代方法:您可以在创建文件时将文件添加到自己的索引中,而不必依靠查询文件系统来获取文件创建时间(并在几天之内击中相同的文件,直到它们过期)。索引可能很简单,就像创建日期之后命名的文件一样,该文件存储在已知位置,每行一个文件。

如果您有一个多线程/多进程应用程序来创建文件,那么您可能希望以更复杂的方式处理索引。

这样做的好处是,您总是可以在某一天创建一个相对简单的文件列表,以进行迭代,而不必一次又一次地向文件系统询问详细信息。

(这将取决于您而非第三方来管理应用程序和文件的创建)。

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.