预定文件夹清理 - 批处理文件

时间:2017-02-15 00:06:09

标签: batch-file cmd robocopy

我目前正在我的第一个初级IT职位工作,我遇到了一个简单的批处理文件。

本质上,文件是通过任务计划程序每周运行的。它会从服务器目录中删除超过8天的文件和文件夹。它也应该删除空文件夹。

forfiles /p "P:\blahblah" /s /m * /d -8 /c "cmd /c del /Q /S /F /A @path"
cd /d P:\blahblah
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"
REM robocopy "P:\blahblah" "P:\blahblah" /s /move"

这里有两个问题; 它偶尔会删除几天前的文件。 它不会删除空文件夹。

该文件由一位年老的IT员工编写,没有文档。我的猜测是使用多种方法来确保清理(具有讽刺意味)。我搜索过谷歌,这是我对每个命令的当前想法..

1)forfiles - forfiles命令似乎写得正确,我没有看到任何问题。

2)cd - 足够简单

3)因为 - 不完全确定。批量变量对我来说是新的,我不确定它是否正常工作。

4)robocopy - 我无法在网上找到有人将目录复制到自身进行清理的实例。我也注意到那里的额外报价,但我不确定它的不正确性。这条线对我来说特别奇怪。

通常情况下,我会尝试通过这样的方式来测试我,但是考虑到我需要查看是否根据日历日期删除内容,快速测试会有点困难。这就是我在这里的原因!

我保证不会问我是不是已经在互联网上搜索过一个想法。任何帮助将不胜感激,我希望更多地了解上述命令!

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  1. forfiles

    在语法上正确并不意味着它能够满足您的需求,它可以满足您的要求。这里的问题是del命令。它将删除forfiles已选择的内容,但您应该测试所选元素不是文件夹。如果您使用文件夹参考调用del /q /s /f /a,则删除文件夹内容。

  2. cd

    很简单,但由于您没有检查操作是否成功(可能P:不可用),可能以下for命令会删除不应该的信息。

  3. for

    正如Squashman评论的那样,如果您将后引号更改为单引号,则不需要usebackq

    但是你需要delims子句来避免包含空格的路径出现问题。 for /f不会迭代文件引用,而是遍历文本行(在本例中由dir命令生成)。默认情况下,制表符和空格是分隔正在处理的行的分隔符,并且默认情况下,仅检索第一个标记。将delims子句设置为空字符列表将禁用此行为。

  4. 您可以尝试使用类似

    的内容
    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        pushd "p:\blahblah" && (
            forfiles /s /m * /d -8 /c "cmd /c if @isdir==FALSE del /q /f /a @path"
            for /f "delims=" %%d in ('" dir /ad /s /b | sort /R "') do rd "%%d"
            popd
        )
    

    pushd会将当前活动目录更改为所需目录。如果命令成功,条件运算符&&(如果前一个命令没有失败则执行下一个命令)将执行其余代码,最后恢复活动目录。

    4)robocopy

    它可用于清理,但不能从文件夹中进行清理。

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        pushd "p:\blahblah" && (
            rem Use a random temporary folder
            for %%t in ("%temp%\clean_%random%%random%%random%%random%.tmp") do (
    
                rem Select the files to keep
                robocopy "." "%%~ft" /MAXAGE:8 /CREATE /s /njh /njs /nfl /nc /ns
    
                rem Remove anything not selected
                robocopy "%%~ft" "." /NOCOPY /PURGE /e /njh /njs /nfl /nc /ns
    
                rem remove temporary folder
            ) & rd /s /q "%%~ft"
    
            rem Restore previous active directory
            popd
        )
    

    此代码将所有选定文件(不超过8天)的副本创建到临时文件夹中,但/CREATE开关告诉robocopy不复制文件,但创建0字节文件进入临时目标。

    一旦我们有一个只包含所选元素的副本,就完成了oposite操作,从临时文件夹到工作文件夹,但是请求不应该进行复制操作(/NOCOPY),只删除不存在的元素在源(/PURGE)。