为什么我的计划任务正确地更新了它的 'Last Run Time',并给出了 '(0x0)' 的 'Last Run Result',但实际上仍然没有工作?

Why is my Scheduled Task updating its 'Last Run Time' correctly, and giving a 'Last Run Result' of '(0x0)', but still not actually working?

我有一个批处理文件设置为 运行 作为 Windows Server 2012 上的计划任务。

当我从命令行手动 运行 批处理文件时,它起作用了。当我在任务计划程序中右键单击我的任务并手动 运行 它时,它仍然工作正常。

但是,如果我让任务 运行 根据为它设置的时间表...那么它似乎有时会工作,但其他人不会。

我已经将任务设置为 运行 作为给定用户;我已经正确设置了它的 'Start in' 目录;我试过给它最高的权限。 None 有帮助。

基本答案是任务 的批处理文件是 运行ning,任务的最后一步是返回 0x0。如果任务显然是 'not doing anything',那是因为任务的某些较早步骤正在静默失败

为什么?就我而言,我认为这很容易影响其他人,答案是 计划任务的批处理文件会看到不同的环境变量,具体取决于用户是否 运行 s 当前是否登录.

更多详情:

特别是,如果任务设置为 运行 作为管理员,则当管理员登录时,任务会看到一组变量(无论是 运行 手动还是按计划) ,但当管理员未登录时,它会看到一组不同的变量。

这可能很难调试 - 基本上,您需要输入大量日志记录!

当您在 Windows Server 2012 上将批处理文件作为计划任务 运行 时,它只会看到共享环境变量。 它看不到您已将其设置为 运行 的用户的用户特定环境变量,除非相关用户当前已登录

您可以通过将 SET > test.txt 单独放入批处理文件,然后 运行 在不同情况下(手动;登录时按计划)将其作为任务来查看实际问题; 在未登录时按计划进行)。

更新:

从更详细的测试来看,似乎当任务设置为运行的用户未登录时,变量USERDNSDOMAIN, USERDOMAINUSERNAME 确实为该用户正确设置了。变量 USERPROFILE 被错误地设置为 Windows 默认用户的值(即 C:\Users\Default)。其他一切都只错误地设置为共享环境变量集(请注意,这显然不是指定用户的正确设置,甚至也不是 Windows 默认用户的正确设置,应该得到它的来自 HKEY_USERS\.Default\Environment).

的用户特定环境变量

注:

这与 windows 7 task scheduler doesn't use updated path 不同,实际上任何共享环境变量的更改,包括 PATH,都会立即被看到(在我所做的测试中,在 Windows 2012 R2),没有重新启动任何进程。