我有一个批处理文件,它设置为在 Windows Server 2012 上作为计划任务运行。
当我从命令行手动运行批处理文件时,它可以工作。当我在任务计划程序中右键单击我的任务并手动运行它时,它仍然可以正常工作。
但是,如果我让任务按照为它设置的时间表运行......那么它有时似乎工作,但不是其他人。
我已经将任务设置为以给定用户身份运行;我已正确设置其“开始于”目录;我试过给它最高权限。这些都没有帮助。
我有一个批处理文件,它设置为在 Windows Server 2012 上作为计划任务运行。
当我从命令行手动运行批处理文件时,它可以工作。当我在任务计划程序中右键单击我的任务并手动运行它时,它仍然可以正常工作。
但是,如果我让任务按照为它设置的时间表运行......那么它有时似乎工作,但不是其他人。
我已经将任务设置为以给定用户身份运行;我已正确设置其“开始于”目录;我试过给它最高权限。这些都没有帮助。
基本答案是任务的批处理文件正在运行,并且任务的最后一步正在返回0x0
。如果任务显然“什么都不做”,那是因为任务的某个较早步骤正在默默地失败
为什么?就我而言,我认为这很容易影响其他人,答案是计划任务的批处理文件会看到不同的环境变量,具体取决于它运行的用户是否当前登录。
更多详情:
特别是,如果任务设置为以管理员身份运行,则当管理员登录时,任务会看到一组变量(无论是手动运行还是按计划运行),但当管理员未登录时,它会看到不同的变量变量集。
这可能很难调试 - 基本上,您需要进行大量日志记录!
当您在 Windows Server 2012 上将批处理文件作为计划任务运行时,它只会看到共享的环境变量。它看不到您已将其设置为运行的用户的用户特定环境变量,除非相关用户当前已登录。
您可以通过单独SET > test.txt
放入批处理文件并在不同情况下将其作为任务运行(手动;登录时按计划;未登录时按计划)来查看实际问题。
更新:
从更详细的测试来看,当任务设置为运行的用户未登录时,变量USERDNSDOMAIN,
USERDOMAIN
和USERNAME
确实为该用户正确设置。该变量USERPROFILE
被错误地设置为 Windows 默认用户(即C:\Users\Default
)的值。其他所有内容都被错误地设置为共享环境变量集(请注意,这显然不是指定用户的正确设置,甚至也不是 Windows 默认用户的正确设置,它应该获取其用户特定的环境变量从HKEY_USERS\.Default\Environment
)。
笔记:
这与Windows 7 任务调度程序不使用更新的路径不同,实际上对任何共享环境变量的更改,包括PATH
,都会立即看到(在我所做的测试中,在 Windows 2012 R2 上),没有重新启动任何进程。