Batch file 为什么我的计划任务要更新其';上次运行时间';正确,并给出一个';上次运行结果';属于';(0x0)和#x27;,但还是不起作用?

Batch file 为什么我的计划任务要更新其';上次运行时间';正确,并给出一个';上次运行结果';属于';(0x0)和#x27;,但还是不起作用?,batch-file,path,scheduled-tasks,windows2012,Batch File,Path,Scheduled Tasks,Windows2012,我有一个批处理文件,它被设置为在Windows Server 2012上作为计划任务运行 当我从命令行手动运行批处理文件时,它可以工作。当我在TaskScheduler中右键单击我的任务并手动运行它时,它仍然可以正常工作 但是,如果我让任务按照为其设置的时间表运行。。。然后,它似乎有时起作用,但其他人则不起作用 我已经将任务设置为作为给定用户运行;我已经正确设置了它的“Start in”目录;我试着给它最高的特权。这些都没有帮助。基本答案是任务的批处理文件正在运行,任务的最后一步是返回0x0。如

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

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

但是,如果我让任务按照为其设置的时间表运行。。。然后,它似乎有时起作用,但其他人则不起作用


我已经将任务设置为作为给定用户运行;我已经正确设置了它的“Start in”目录;我试着给它最高的特权。这些都没有帮助。

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

为什么??在我的例子中,我认为这很容易影响到其他人,答案是调度任务的批处理文件会看到不同的环境变量,这取决于它运行的用户当前是否登录

更多详细信息:

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

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

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

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

更新:

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

注意:

这与问题不同,事实上,对任何共享环境变量(包括
PATH
)的更改都可以立即看到(在我做的测试中,在Windows 2012 R2上),而不需要重新启动任何进程