我在 Windows 10 Pro 上运行一项日常任务,该任务应该
- 将计算机从休眠状态唤醒
- 启动cmd.exe,运行命令脚本将文件复制到网络驱动器,创建日志文件
- 关闭计算机
从任务计划程序中手动启动任务时,一切都按预期执行。
当计算机处于休眠模式时,任务计划程序会在指定时间唤醒计算机,但显然命令文件 (.cmd) 根本没有执行。没有创建日志文件,没有复制文件,并且计算机没有关闭。任务被标记为“成功完成,返回代码为 2147942401”即十六进制 0x80070001。此错误代码似乎表示“非法函数”,但我不知道那是什么,尤其是因为如前所述,手动启动任务时运行良好。
以下是任务设置的概述(从德语翻译而来,但应该很清楚):
常规:无论用户是否登录都执行;不存储密码;最高权限;针对 Windows 10 配置
操作:启动程序 cmd.exe;参数:/c "path-to-cmd-script\script.cmd >> logfile.txt";启动于:空
条件:重新激活计算机
设置:如果需要则允许执行;如果执行失败,则每 10 分钟重新启动一次;如果执行时间超过 3 天,则结束任务;如果未按要求停止,则强制结束活动任务;不启动新实例
我还有另一项任务要做备份确切地运行良好的相同设置(唤醒、运行脚本,然后关闭计算机)。
非常感谢任何提示,欢迎提问。
答案1
其实不是。不过,我使用了最简单的任务计划程序设置,现在它可以正常工作了。
一般的:
- 仅在用户登录时使用
- 使用最高权限
- 针对 Windows 10 配置
行动:
程序/脚本:C:\Windows\System32\cmd.exe
参数:/c <your batch file with parameters>
状况:
- 重新启动计算机
设置:
- 如果需要则允许执行
- 如果错过了启动,请尽快执行
- 如果任务失败,则每 5 分钟重新启动一次
- 如果执行超过 3 天则终止任务
- 若未按要求停止则强制终止
- 如果任务已在运行,则停止当前实例
现在它已经连续几个月每天在指定时间运行。
答案2
Powershell 对计划任务很挑剔。我为此花费了很多时间。以下是我使用久经考验的批处理文件进行故障排除的方法。
尝试创建一个中间批处理文件并让该批处理文件调用 powershell。使用批处理文件,您可以执行一系列 echo 并将其输出到日志中。这将允许您查看该过程的完整 stdout/stderr。这可能有助于更详细地进行故障排除。
可以通过附加到计划任务参数来创建日志> "<path_to_log_file>" 2>&1
。
答案3
对我来说,任务有时会成功,有时则不会。根据计划任务历史记录,当失败时,它看起来好像已经运行了大约 40 秒,什么也没做,然后就完成了action "C:\windows\SYSTEM32\cmd.exe" with return code 2147942401
。
在这种情况下,没有必要弄乱组策略设置,因为有时它会有效,但不是每次都有效(见https://stackoverflow.com/questions/48343993/batch-file-from-scheduled-task-returns-code-2147942401/)。
简化、重新创建、重新配置我的任务都无法解决问题。
我也考虑过删掉我的批处理文件并去掉标准输出重定向,从而放弃日志记录功能(并变得盲目)。或者简单地运行一个实际的 .exe 进程,而不是使用批处理文件。这可能是一个解决方案。
我还考虑过用服务替换“启动时”计划任务,但对于这样一个简单的问题来说,这将是一个相当昂贵的实验。
最终,我考虑在计划任务上添加延迟,并寻求将我的任务配置为延迟服务 - 服务可以是“自动”或“自动(延迟启动)”。对于“启动时”计划任务,触发器具有其自己的单独属性,包括添加延迟的能力:
我认为我的计划任务有时会提前几毫秒启动,并且某些操作系统服务或功能尚未可用或被允许。只需在触发器上添加一个小延迟即可解决问题。