批处理脚本删除过去5天的文件

时间:2014-07-25 17:51:36

标签: batch-file scheduled-tasks

我有一个批处理脚本,我每天晚上都在午夜运行任务计划程序。这是脚本:

forfiles /M *.bak /p "Z:\Logs" /S /D -5 /C "cmd /c del @file : date >= 5 days >NUL"

但是当任务在午夜运行时,它不会删除超过5天的文件。如果我双击批处理文件并手动运行它,它会删除超过5天的文件。有什么不对或我需要做些不同的工作才能使这项工作?

编辑:

这是我的完整批处理文件以及有关任务计划的更多信息:

sqlcmd -S server\SQLEXPRESS -U user -P password -i "D:\BackupPrograms\translogsbackup.sql"
forfiles /M *.trn /p "Z:\Logs" /S /D -5 /C "cmd /c del @file >NUL"

我正在使用管理员帐户来执行每晚运行的任务计划。我试图让它删除sqlcmd正在创建的旧备份,这样我确保我不会在不需要的Full SQL备份上浪费大量空间。我希望这会有所帮助。我很困惑,为什么批处理文件将通过任务计划程序执行不同的操作,并且当我双击它以运行时。

1 个答案:

答案 0 :(得分:1)

从命令提示符开始,它不会比调度程序更有效,这就是原因。

/C "cmd /c del @file : date >= 5 days>NUL"

:在命令行中的该位置是非法的,并且被忽略。

>=被解释为输出重定向符号,因此所有输出都被重定向到当前目录中名为5的文件。

您可以在命令提示符下自行测试:

  1. 从命令提示符处在系统上创建一个新的空文件夹,例如C:\Test,并将其设为活动目录。

    C:\>md Test
    C:\>cd Test
    
  2. 在文件夹中创建几个虚拟文件:

    C:\Test>echo file1 > file1.txt
    C:\Test>
    C:\Test>echo file2 > file2.txt
    
  3. 做一个目录,看看那里有什么:

    C:\Test>dir /b
    
    file1.txt
    file2.txt
    
    C:\Test>
    
  4. 尝试使用此forfiles命令查看输出:

    C:\Test>forfiles /M *.txt /C "cmd /c echo @file"
    
    "file1.txt"
    "file2.txt"
    
    C:\Test>
    
  5. 更改forfiles以添加: date >= 5 days并再次运行:

    C:\Test>forfiles /M *.txt /C "cmd /c echo @file : date >= 5 days"
    
    C:\Test>
    
  6. 做一个目录,看看那里有什么:

    C:\Test>dir /b
    
    5
    file1.txt
    file2.txt
    
    C:\Test>
    
  7. 请注意名为 5 的新文件。

    解决方案:删除: date >= 5 days。您可以离开NUL部分,因为它合法地将任何输出重定向到NUL(无),以便它不会显示。所以你的命令看起来像这样:

    forfiles /M *.bak /p "Z:\Logs" /S /D -5 /C "cmd /c del @file >NUL"