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

Batch file calls another batch when i execute it directly, but not when scheduled

我有这个 Batchscript(简单地说,删除了所有 REM 注释和 echo 输出到一个 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 window 中时,DeleteOldFiles.bat 脚本被正确调用。

代码的第三行将文件“_folderlist.txt”放置在当前目录中。 其他行使用路径“D:_script_autodel” 如果当前路径不同,第四行将无法找到该文件。

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

从任务计划程序启动时您的工作目录将为 c:\windows\system32。您没有指定 batch-file 的路径,您正试图 运行,因此找不到。您需要指定文件的路径:

for /F "tokens=*" %%A in (D:\_script_autodel\_folderlist.txt) do call "D:\_script_autodel\DeleteOldFiles.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"

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

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

上面一行有问题。首先它没有使用正确的语法 set "var=string value"。然后它会不必要地扩展 %DATE% 变量字符串,因为 ~0 是包括第一个字符在内的所有内容。它还打印 %TIME% 变量值字符串的前八个字符,这是未知的,因为它的格式是用户、PC、区域设置和语言可配置字符串值。它还在我看来是一个 st运行ge 原因,将字符串 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 …,还有一个主要问题,即您将每一行逐行传递给另一个批处理文件.因此,本意是 return 这个脚本,在每个都处理完之后,所以你应该使用 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_autodel\DeleteOldFiles.bat。如果在其他地方。