运行计划任务时,批处理文件无法删除文件夹

Kay*_*son 3 privileges batch-file scheduled-tasks

我有一个问题,我无法理解,所以我希望我把它放在StackNetwork的正确部分.

我有一个批处理文件.

它转储数据,压缩文件,然后删除刚刚压缩的源文件夹.

这是最后的步骤

CD "C:\Backup\%DATE%\"

REM ----- NOW ZIP THE FILE AND DELETE THE SOURCE -----
"C:\Program Files\WinRAR\WinRAR.exe" a -r -afzip "C:\Backup\%DATE%.zip"

CD "C:\BackUp\"

RMDIR /s /q "C:\BackUp\%DATE%\"
Run Code Online (Sandbox Code Playgroud)

这行代码删除了该文件夹.

    RMDIR /s /q "C:\BackUp\%DATE%\"
Run Code Online (Sandbox Code Playgroud)

问题是:

当我手动执行计划任务时,通过右键单击任务并选择RUN,批处理文件运行良好并最终删除该文件夹.

但是当任务在夜间自动运行时,一切顺利,文件夹不会被删除.

我认为这与私有有关,因为它在我手动RUN执行任务时确实有效,但有趣的是该文件夹%DATE%是在批处理文件中创建的.

即使用户已登录,任务也设置为以最高权限运行.

Mof*_*ofi 6

在我写关于目录删除失败的可能原因的想法之前,我建议在批处理文件中使用:

RMDIR /s /q "C:\BackUp\%TODAY%\" 2>"C:\BackUp\RemoveDirError.log"
Run Code Online (Sandbox Code Playgroud)

"C:\BackUp\RemoveDirError.log"在下一个计划任务运行之后查看,该任务应该包含错误消息,希望有助于找到删除目录失败的原因.


1. DATE在批处理执行的开始和结束之间有所不同

环境变量DATE的值始终是当前日期.

如果此批处理文件在午夜执行,则批处理文件开头的DATE值将与批处理文件末尾的值不同.

例:

批处理文件每天23:30:00启动,需要50分钟才能完成.

在这种情况下,执行时的批处理代码例如:

CD "C:\Backup\2014-09-08\"

REM ----- NOW ZIP THE FILE AND DELETE THE SOURCE -----
"C:\Program Files\WinRAR\WinRAR.exe" a -r -afzip "C:\Backup\2014-09-08.zip"

CD "C:\Backup\"

RMDIR /s /q "C:\Backup\2014-08-10\"
Run Code Online (Sandbox Code Playgroud)

注意:日期字符串的格式取决于日期的Windows语言设置.

结果是错误消息:

该系统找不到指定的文件.

此问题的解决方案是将DATE值分配给批处理文件开头的新变量,并在整个批处理文件中引用此变量而不是DATE.

set TODAY=%DATE%
CD "C:\Backup\%TODAY%\"

REM ----- NOW ZIP THE FILE AND DELETE THE SOURCE -----
"C:\Program Files\WinRAR\WinRAR.exe" a -r -afzip "C:\Backup\%TODAY%.zip"

CD "C:\BackUp\"

RMDIR /s /q "C:\BackUp\%TODAY%\"
Run Code Online (Sandbox Code Playgroud)

环境变量TODAY在此处包含在执行批处理文件期间绝对未更改的日期字符串.


2. WinRAR作为单独的进程启动

另一个问题可能是WinRAR是Windows应用程序而不是控制台应用程序,因此可以在与批处理文件并行执行的单独进程中C:\BACKUP\%DATE%\作为当前工作目录执行.

在这种情况下,批处理作业将在字符串WinRAR之后立即继续执行,这就是Windows阻止删除目录的原因.

解决方案是使用start带选项的命令/wait强制运行WinRAR作为单独的进程,但停止执行批处理作业,直到WinRAR在完成压缩后自行终止.

set TODAY=%DATE%
CD "C:\Backup\%TODAY%\"

REM ----- NOW ZIP THE FILE AND DELETE THE SOURCE -----
start "Backup Compression" /wait /min "C:\Program Files\WinRAR\WinRAR.exe" a -r -afzip "C:\Backup\%TODAY%.zip"

CD "C:\BackUp\"

RMDIR /s /q "C:\BackUp\%TODAY%\"
Run Code Online (Sandbox Code Playgroud)

但这很可能不是原因,因为在这种情况下,删除文件夹也会在手动运行计划任务时失败.


3. WinRAR输出一个问题,没有人回答

WinRAR可能在压缩期间检测到问题,并打开一个消息提示,其中包含用户要回答的问题.正如计划任务执行没有人回答它,WinRAR持续压缩很长一段时间.

该溶液将被加入-yWinRAR的在批处理文件的命令行.

start "Backup Compression" /wait /min "C:\Program Files\WinRAR\WinRAR.exe" a -r -afzip -y "C:\Backup\%TODAY%.zip"
Run Code Online (Sandbox Code Playgroud)

我想,这不太可能不删除目录.


我没有更多的想法.我们需要查看完整的批处理文件代码,如果上面没有任何内容有助于找到在运行批处理文件时删除目录时出错的原因,作为自动执行的计划任务.