我有一个批处理脚本,我每天晚上都在午夜运行任务计划程序。这是脚本:
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备份上浪费大量空间。我希望这会有所帮助。我很困惑,为什么批处理文件将通过任务计划程序执行不同的操作,并且当我双击它以运行时。
答案 0 :(得分:1)
从命令提示符开始,它不会比调度程序更有效,这就是原因。
/C "cmd /c del @file : date >= 5 days>NUL"
:
在命令行中的该位置是非法的,并且被忽略。
>=
被解释为输出重定向符号,因此所有输出都被重定向到当前目录中名为5
的文件。
您可以在命令提示符下自行测试:
从命令提示符处在系统上创建一个新的空文件夹,例如C:\Test
,并将其设为活动目录。
C:\>md Test
C:\>cd Test
在文件夹中创建几个虚拟文件:
C:\Test>echo file1 > file1.txt
C:\Test>
C:\Test>echo file2 > file2.txt
做一个目录,看看那里有什么:
C:\Test>dir /b
file1.txt
file2.txt
C:\Test>
尝试使用此forfiles
命令查看输出:
C:\Test>forfiles /M *.txt /C "cmd /c echo @file"
"file1.txt"
"file2.txt"
C:\Test>
更改forfiles
以添加: date >= 5 days
并再次运行:
C:\Test>forfiles /M *.txt /C "cmd /c echo @file : date >= 5 days"
C:\Test>
做一个目录,看看那里有什么:
C:\Test>dir /b
5
file1.txt
file2.txt
C:\Test>
请注意名为 5 的新文件。
解决方案:删除: date >= 5 days
。您可以离开NUL
部分,因为它合法地将任何输出重定向到NUL(无),以便它不会显示。所以你的命令看起来像这样:
forfiles /M *.bak /p "Z:\Logs" /S /D -5 /C "cmd /c del @file >NUL"