当我直接执行批处理文件时,它会调用另一个批处理,但不会在计划时调用



我有这个Batchscript(简单地说,删除了所有REM注释和回显输出到txt文件(:

SET DateTime=%date:~0% - %time:~0,8% Uhr
DEL D:_script_autodel_folderlist.txt
dir D:Interfaces /s /b /a:d /o:n >> D:_script_autodel_folderlist.txt
for /F "tokens=*" %%A in (D:_script_autodel_folderlist.txt) do DeleteOldFiles.bat %%A

执行适用于前3行,但第4行没有执行,或者至少在作为计划任务运行时没有输入DeleteOldFiles.bat。

当我直接在cmd窗口中运行脚本时,DeleteOldFiles.bat脚本会被正确调用。

首先,我们将逐行检查您的代码:

SET DateTime=%date:~0% - %time:~0,8% Uhr

上述线路存在问题。首先,它没有使用正确的语法set "var=string value"。然后它不必要地扩展%DATE%变量字符串,因为~0是包括第一个字符在内的所有内容。它还打印%TIME%变量值字符串的前八个字符,这是未知的,因为它的格式是用户、PC、区域设置和语言可配置的字符串值。在我看来,这也是一个奇怪的原因,它将字符串Uhr后缀到末尾。我本以为只有当你包括小时,或者按照已知的时间表运行小时和分钟,而不是前八个字符的时,它才会被包括在内

DEL D:_script_autodel_folderlist.txt

首先,为了获得最佳实践,文件路径应始终使用双引号。它不会首先检查文件是否存在,因此如果不存在,可能会生成错误消息。此外,它也没有真正的用途,因为如果它不存在,下一行将创建它,如果存在,将覆盖它。

dir D:Interfaces /s /b /a:d /o:n >_folderlist.txt

这一行在最佳实践中再次不使用双引号,并创建了一个文件,该文件只有在下一个命令行中使用时才需要。除此之外,它没有任何用途,因此,我们应该将它合并到下一行中,而不必创建不必要的文件。

for /F "tokens=*" %%A in (D:_script_autodel_folderlist.txt) do DeleteOldFiles.bat %%A

上一行有一个小问题,再次是最佳实践双引号:For /F "UseBackQ Tokens=*" %%A In ("D:_script_autodel_folderlist.txt") Do …,还有一个主要问题,即您正在将每一行逐个传递给另一个批处理文件。因此,目的是在处理完每个脚本之后返回到此脚本,因此应该使用Call命令。

因此,您只需要一行:

@For /F "Tokens=*" %%G In ('Dir "D:Interfaces" /A:D /B /O:N /S" 2^>NUL') Do @Call "%~dp0DeleteOldFiles.bat" "%%G"

请注意,您的代码没有定义当前的工作目录,这是脚本中的一个主要问题。当从任务调度程序运行时,当前工作目录不太可能与您自己调用它时相同。因此,我使用了您的批处理文件的完整路径。在这种情况下,我使用%~dp0来表示它与正在运行的批处理文件相同的位置。请根据需要将其替换为另一个绝对路径,例如D:_script_autodelDeleteOldFiles.bat。如果它在其他地方。

从任务调度程序启动时,您的工作目录将是c:windowssystem32。您没有指定要运行的batch-file的路径,因此找不到它。您需要指定文件的路径:

for /F "tokens=*" %%A in (D:_script_autodel_folderlist.txt) do call "D:_script_autodelDeleteOldFiles.bat" %%A

但是,您可以使用pushd. You can also skip the deletion of the_folderlist.txtfile if you use single redirect>跳过到处写入路径因为这将在每次启动脚本时替换内容。

@echo off
set "DateTime=%date:~0% - %time:~0,8% Uhr"
pushd "D:_script_autodel"
(dir "D:Interfaces" /s /b /a:d /o:n)>"_folderlist.txt"
for /F "tokens=*" %%A in (_folderlist.txt) do call DeleteOldFiles.bat "%%~A"

代码的第三行将文件&quot_folderlist.txt";在当前目录中。其他行使用路径"0";D: _script_autodel"如果当前路径不同,第四行将无法找到文件。

解决方案:更改第三行以包含文件的完整路径。

最新更新