作为计划任务执行批处理文件时必须考虑什么?

What must be taken into account on executing a batch file as scheduled task?

我有一个 运行 的计划任务,但它似乎不起作用。此任务执行一个批处理文件。批处理文件只包含一行:

wscript c:\myfolder/myscript.vbs

此 VBScript 文件启动命令提示符,执行 vpncli,休眠一分钟,然后继续建立连接,将用户 name/password 发送到命令行 window。

当 运行 来自命令提示符 window 的批处理文件时,这工作正常,但使用计划任务没有成功。它运行任务的帐户是服务托管帐户。 运行 任务完成后,我在一个单独的命令行 window vpncli 中查看,发现连接仍然断开。

在计划任务中执行批处理文件解决该问题需要注意什么?

下面是我用来在 CMD shell 中执行的部分代码。执行了以下子程序:

Sub VPN_open
  VPN_Profile = "vpn.myhost.com"
  VPN_User = "USERNAME"
  ' If the password contains special characters, enclose the characters in curly braces {}.
  VPN_Password = "PASSWORD"
  
  oShell.Run "cmd"      
  WScript.Sleep 100
  
  oShell.AppActivate "C:\Windows\System32\cmd.exe"      
  oShell.SendKeys "vpncli connect " & VPN_Profile & "~"
  
  WScript.Sleep 10000
  
  oShell.SendKeys VPN_User & "~"
  
  WScript.Sleep 5000
  
  oShell.SendKeys VPN_Password & "~"
  
  WScript.Sleep 10000
  
  oShell.SendKeys "exit~"      
End Sub 'VPN_open

使用只有一个命令行的批处理文件作为计划任务通常没有多大意义。最好直接在计划任务中指定 运行 由批处理文件及其参数执行的应用程序,在这种情况下 %SystemRoot%\System32\wscript.exe 带有参数 "C:\myfolder\myscript.vbs".

如果仅使用控制台应用程序,最好使用 cscript - Windows 脚本宿主的控制台版本 - 而不是 wscript - Windows GUI 版本Windows 脚本宿主。两个应用程序的帮助都显示在 运行ning 命令提示符 window cscript /? 中,帮助直接输出到控制台 window 和 wscript /?,帮助显示在 GUI 中window.

在运行定时任务中至少要考虑四点:

  1. 计划任务属性中配置的用户帐号。

    使用的帐户决定了对本地磁盘和网络共享的权限。例如,本地管理员或系统帐户通常没有访问本地网络上任何资源的权限,但可以完全访问本地驱动器上的任何目录。它还定义了可用的环境变量和所有区域和语言相关的设置,例如命令 datetime 的日期和时间格式以及动态变量 DATETIME Windows 命令处理器。

  2. 启动计划任务时设置的当前工作目录。

    如果在计划任务的属性中没有配置其他文件夹以用作启动文件夹,则启动计划任务的默认目录是 %SystemRoot%\System32。双击带有盘符的驱动器上的批处理文件时,批处理文件的目录是当前工作目录。批处理文件执行的任何脚本都应考虑到这一点。最好是通过对包括可执行文件在内的所有文件使用完全限定的文件名来编写独立于当前目录的脚本。

  3. 为计划任务定义的环境取决于使用的帐户。

    有用于所有用户帐户的系统环境变量和与用户帐户相关的环境变量。在 运行 使用不同的用户帐户(如本地管理员或系统帐户)执行计划任务时,无法定义某些环境变量,这些环境变量是在使用自己的用户帐户 运行 使用相同的脚本时定义的。建议将脚本作为计划任务执行,尽可能独立于环境变量,但由 Windows 自动定义的系统变量除外,如 SystemRoot。维基百科文章 Windows Environment Variables 列出并描述了 Windows.

    定义的环境变量
  4. 作为网络驱动器连接的网络共享通常在 运行 执行计划任务时不可用。

    Windows 存储在 当前用户 的注册表中,网络共享作为网络驱动器永久连接。这些网络共享在用户登录时连接(映射到驱动器号),并在用户注销时自动断开连接。 运行使用与自己帐户不同的帐户将脚本作为计划任务使网络驱动器对脚本不可用,因为网络共享既没有连接为网络驱动器,也没有其他帐户最有可能访问网络资源.即使在计划任务的属性中配置为使用自己的用户帐户,网络驱动器也不可用,因为在 运行 计划任务之前没有登录,除了计划任务配置为 运行仅当用户登录时。

    解决方案是在脚本中使用 UNC 路径和对网络资源或地图具有所需访问权限的帐户,例如

    net use X: \ComputerName\ShareName password /user:DomainName\AccountName /persistent:no

    驱动 X: 的共享并在使用

    退出脚本执行之前断开它 net use X: /delete /yes

    运行 在命令提示符 window net use /? 中获取有关此命令的帮助。

    通过为计划任务使用具有网络共享访问权限的帐户,无需在(批处理)脚本中指定密码和帐户名,这更加安全,否则每个对脚本文件具有读取权限的人都可以看到未加密的内容密码和帐户名。 Windows 存储加密的计划任务凭据。

因此 VB 脚本在使用当前用户帐户手动执行时工作正常,当前目录是批处理文件的目录,其中为当前用户帐户定义了环境变量,并且可能连接了由访问的网络驱动器必须调查脚本和脚本调用的应用程序,以找出脚本无法作为计划任务使用为计划任务配置的属性运行的原因。