3

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

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

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

我已经将任务设置为以给定用户身份运行;我已正确设置其“开始于”目录;我试过给它最高权限。这些都没有帮助。

4

1 回答 1

4

基本答案是任务的批处理文件正在运行,并且任务的最后一步正在返回0x0。如果任务显然“什么都不做”,那是因为任务的某个较早步骤正在默默地失败

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

更多详情:

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

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

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

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

更新:

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

笔记:

这与Windows 7 任务调度程序不使用更新的路径不同,实际上对任何共享环境变量的更改,包括PATH,都会立即看到(在我所做的测试中,在 Windows 2012 R2 上),没有重新启动任何进程。

于 2015-09-15T15:00:49.460 回答