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

Shell 批处理文件在我直接执行它时调用另一个批处理,但不是在计划时,shell,loops,batch-file,scheduled-tasks,Shell,Loops,Batch File,Scheduled Tasks,我有这个Batchscript(简化了,删除了所有REM注释并将输出回送到txt文件): 前3行执行有效,但第4行未执行,或者至少在作为计划任务运行时未输入DeleteOldFiles.bat 当我在cmd窗口中直接运行脚本时,DeleteOldFiles.bat脚本被正确调用。代码的第三行将文件“\u folderlist.txt”放在当前目录中。 其他行使用路径“D:_script_autodel” 如果当前路径不同,第四行将无法找到文件 解决方案:更改第三行以包含文件的完整路径。从任务计划

我有这个Batchscript(简化了,删除了所有REM注释并将输出回送到txt文件):

前3行执行有效,但第4行未执行,或者至少在作为计划任务运行时未输入DeleteOldFiles.bat


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

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


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

从任务计划程序启动时,您的工作目录将是
c:\windows\system32
。您没有指定要运行的批处理文件的路径,因此找不到该文件。您需要指定文件的路径:

for /F "tokens=*" %%A in (D:\_script_autodel\_folderlist.txt) do call "D:\_script_autodel\DeleteOldFiles.bat" %%A
但是,您可以通过使用
pushd跳过在任何地方写入路径。如果使用单重定向,也可以跳过删除
\u folderlist.txt
文件,因为每次启动脚本时都会替换内容

@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
上面这一行有问题。首先,它没有使用正确的语法,
设置“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:\\u script\u autodel\\u 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
表示sam它的位置,作为正在运行的批处理文件。请根据需要替换为另一个绝对路径,例如
D:\\u script\u autodel\DeleteOldFiles.bat
。如果它在别处。

这不是问题。脚本在D:\u script\u autodel内部调用,文件folderlist.txt正在被删除和重建…我还是尝试了它,但这是错误的s不能解决问题。任务计划程序历史记录会抛出成功消息或返回代码0OJ是正确的。当您手动运行脚本时,您可能位于正确的文件夹中。当您将其作为计划任务运行时,请检查工作文件夹(我猜不是您认为的那样)将
dir
输出显式重定向到
”D:\\u script\u autodel\\u folderlist.txt“
。我在(D:\u script\u autodel\u folderlist.txt)中将目录输出更改为:for/F“tokens=*”%%Ado DeleteOldFiles.bat%%A&echo%%A>>D:_script\u autodel\log.txt尽管如此,它仍然不起作用…但我注意到了一些有趣的事情-也许这有助于找到解决方案:-我将第4行更改如下:for/F“tokens=*”%%A in(D:_script\u autodel\u folderlist.txt)do DeleteOldFiles.bat%%A&echo%%A>>D:_script\u autodel\log.txt-当我作为计划任务运行它时,它会打印出整个数组。当我直接运行它时,它会按照它应该的顺序逐行执行调用
DeleteOldFiles.bat
如果没有路径,则假定它在工作目录中,即
c:\windows\system32
在明显找不到的地方。将其设置为:
for/F“tokens=*”%%A在(D:\\\\脚本\自动删除\文件夹列表.txt)中调用“D:\\脚本\自动删除\删除文件夹.bat”%%A
for /F "tokens=*" %%A in (D:\_script_autodel\_folderlist.txt) do DeleteOldFiles.bat %%A