zoukankan      html  css  js  c++  java
  • CMD批处理——forfiles命令使用,自动删除过期备份文件

    公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份。
    因为只要保留最近几天的备份,如果可以做一个批处理让系统自动删除老备份文件就好了,但是Windows的命令行和Linux的Shell比起来功能差了很多,到底行不行我自己也不清楚。
    于是上网查了一下各位大虾发的帖子,再经过自己的摸索和尝试,发现只要花点功夫还是能实现这个功能的。
    Windows Server 2003内置的命令行文件,适合于XP以上系统
    示例:


    forfiles /m *.bkf /d -28 /c "cmd /c del @file /f"

    删除当前目录下28天以前的扩展名为bkf文件(以当前系统时间为基准)
    forfiles 自动删除7天前文件 delete2008-09-12 15:01
    用forfiles.exe试试。


    forfiles /p "d: est" /s /m *.* /d -7 /c "cmd /c del @path"

    做成批处理文件,bat文件与forfiles.exe同一目录下,建一个bat文件的快捷方式在启动。
    d: est换成你要的目录路径。日期是指修改的日期。
    附上forfiles.exe及帮助。
    删除所有的空目录(以删除d: est目录下为例)


    dir /ad/b/s d: est |sort /r >d:kill.txt
    For /f "tokens=*" %%i in (d:kill.txt) DO rd "%%i"
    del d:kill.txt


    把以下复制到bat文件中。


    @echo off
    forfiles /p "d: est" /s /m *.* /d -7 /c "cmd /c del @path"
    dir /ad/b/s d: est |sort /r >d:kill.txt
    For /f "tokens=*" %%i in (d:kill.txt) DO rd "%%i"
    del d:kill.txt


    先删过期文件,再删所有的空目录
    如果操作系统是 Windows Server 2003 那就好办了,因为它有一个forfiles命令能够查找满足指定条件的文件,下面是这个命令的用法。
    forfiles /p <目标目录名> /d <天数> /c <执行的命令>
    看看列出的三个参数都有什么用处:
    /p 指定了要在哪个目录里查找文件,默认是当前工作目录。
    /d 指定一个日期或天数,用于比较文件的最后修改日期是否符合条件。
    /c 对每个找到的文件执行的命令。
    例1.要把在C盘根目录下最后修改日期大于或等于2007年7月1日的文件复制到D盘根目录下:
    forfiles /p "c:" /d "2007-7-1" /c "cmd /c copy @path d:"
    例2.删除在C盘backup目录下最后修改日期在10天前的文件:
    forfiles /p "c:ackup" /d -10 /c "cmd /c echo deleting @file ... && del /f @path"
    先看删除文件的代码
    forfiles /p 包含要删除文件的完整路径(如:F:Logfiles) /m *.log -d -7 /c "cmd /c del /f @path"
    解释一下相关参数及命令
    /p : 指定开始搜索文件的位置,如果不指定则默认为当前目录。
    /m : 文件查找所使用的通配符如代码中的"*.log"则为所有日志文件,当然也可以指定诸如"manmee_*.log"这样以manmee开头的所有日志文件。如果不指定此参数则默认为"*.*"。
    /d [{+|-}][{|}] : 指定想选择文件的最后修改时间,上文中用了 "/d -7" 表示所有以当天为基础,7天以前的文件。当然这里还可以指定具体时间,例如:"/d -08/18/2009"这样所有早于2009年8月18日的文件。注意指定的时间必须是"MM/DD/YYYY"的格式。
    /c 对所有文件以此执行指定的命令,命令体须在双引号(")内,默认是"cmd /c echo @file"。上文中用到的是"cmd /c del /f @path"删除指定文件。(这里的@file 和 @path 为变量,下文中将解释。)
    下面说一下上文中用到的参数:
    @PATH : 表示文件的完整的路径。
    @File : 表示文件名称。
    其他参数的详细介绍点击这里。
    接下来我们看看删除文件夹的操作,如果你看了上面的介绍,相信这命令你一看就能看懂。
    forfiles /p 包含文件夹的路径(如:F:) /m 文件夹名称(如:LogFiles) -d 0 /c "cmd /c if @ISDIR == true rd /s/q @path"
    注意这里的"包含文件夹的路径"不能包含要删除的文件夹,如以上代码所表示的就是,在F盘中查找名为LogFiles的文件或文件夹(不能指定查找文件夹,不过在删除时我们做了判断)。
    还有就是这里出现了一个新的参数"@ISDIR"他用于判断当前文件类型是否是"文件夹类型",如果是则为true否则为false。
    相信到这大家就明白了,最后再将代码保存为批处理文件,然后加入计划任务定期执行即可。
    看了上面的例子,觉得在 Windows Server 2003 下面要删除老文件很简单吧。
    但如果操作系统是 Windows 2000/XP 就比较麻烦,因为它们没有forfiles命令,只能靠自己写批处理来实现了。
    下面是我写的批处理文件内容:


    @echo off
    rem ******************************
    rem * 按时间删除文件目录的批处理 *
    rem ******************************
    rem 设置临时目录的路径
    set tempDir=%tmp% emove_%date:~0,10%
    if not exist %tempDir% md %tempDir%
    rem 设置处理日期的脚本文件的路径
    set scriptFile=%tempDir%get_date.vbs
    rem 获得要保留的天数
    set days=%~1
    if "%days%" == "" goto printUsage
    rem 获得目标目录的路径
    set dirPath=%~2
    if "%dirPath%" == "" set dirPath=.
    rem 获得要操作的文件形式
    set fileSpec=%~3
    if "%fileSpec%" == "" set fileSpec=*.*
    rem 生成计算日期的脚本文件并获得删除的截止日期
    echo d=date()-%1 > %scriptFile%
    echo s=right("0000" ^& year(d),4) ^& "-" ^& right("00" ^& month(d),2) ^& "-" ^& right("00" ^& day(d),2) >> %scriptFile%
    echo wscript.echo s >> %scriptFile%
    for /f %%i in ('cscript /nologo %scriptFile%') do set lastDate=%%i
    rem 处理目标目录里的每个对象
    for /f "tokens=1,2,3* delims=<> " %%i in ('dir "%dirPath%\%fileSpec%" /a /-c /tc') do call :proc "%%i" "%%j" "%%k" "%%l"
    goto :done
    rem 处理目标目录里对象的过程
    :proc
    rem 获得对象的创建日期并判断是否为有效格式
    set fileDate=%~1
    echo %fileDate% | findstr "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" > nul
    if errorlevel 1 goto end
    rem 获得对象的类型
    set fileType=%~3
    if "%fileType%" == "" goto end
    rem 获得对象的名称
    set fileName=%~4
    if "%fileName%" == "" goto end
    if "%fileName%" == "." goto end
    if "%fileName%" == ".." goto end
    if "%fileName%" == "字节" goto end
    if "%fileName%" == "可用字节" goto end
    rem 判断对象日期是否小于或等于删除的截止日期
    if "%fileDate:~0,10%" leq "%lastDate%" (
    echo deleting "%fileName%" ...
    if "%fileType%" == "DIR" ( rd /s /q "%dirPath%\%fileName%" ) else ( del /q /f "%dirPath%\%fileName%" )
    )
    goto end
    :error
    echo An error occurred during backuping.
    :done
    rd /s /q %tempDir%
    goto end
    :printUsage
    echo Usage: %0 ^<Days^> [Work directory] [Target file specification (can include wildcards)]
    goto end
    :end


    主要是利用Windows的脚本功能来计算要删除文件的截止日期,然后for加dir命令来提取文件的日期进行判断。
    关于forfiles和for的详细信息,可以在Windows的帮助与支持中找到。
    原文地址:
    http://www.360doc.com/content/10/1229/20/5287961_82437251.shtml
  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/landv/p/6661461.html
Copyright © 2011-2022 走看看