Batch file 在按计划任务执行批处理文件时,必须考虑什么?

Batch file 在按计划任务执行批处理文件时,必须考虑什么?,batch-file,scheduled-tasks,Batch File,Scheduled Tasks,我有一个正在运行的计划任务,但它似乎不起作用。此任务执行批处理文件。批处理文件仅包含一行: wscript c:\myfolder/myscript.vbs 此VBScript文件启动命令提示符,执行vpncli,休眠一分钟,然后继续设置将用户名/密码发送到命令行窗口的连接 当从命令提示符窗口运行批处理文件时,此操作正常,但使用计划任务未成功。在其下运行任务的帐户是服务管理帐户。运行任务后,我在一个单独的命令行窗口vpncli中进行检查,查看连接是否仍然断开 要解决此问题,在计划任务中执行批处

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

wscript c:\myfolder/myscript.vbs
此VBScript文件启动命令提示符,执行
vpncli
,休眠一分钟,然后继续设置将用户名/密码发送到命令行窗口的连接

当从命令提示符窗口运行批处理文件时,此操作正常,但使用计划任务未成功。在其下运行任务的帐户是服务管理帐户。运行任务后,我在一个单独的命令行窗口
vpncli
中进行检查,查看连接是否仍然断开

要解决此问题,在计划任务中执行批处理文件时必须考虑什么

下面是我用来在cmdshell中执行的代码的一部分。执行以下子例程:

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”

在仅使用控制台应用程序时,最好使用Windows脚本主机的控制台版本
cscript
,而不是Windows脚本主机的Windows GUI版本
wscript
。这两个应用程序的帮助在命令提示窗口中运行时显示,帮助直接输出到控制台窗口,帮助显示在GUI窗口中

在按计划任务运行时,必须至少考虑四点:

  • 在计划任务的属性中配置的用户帐户。

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

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

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

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

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

  • 作为网络驱动器连接的网络共享在运行计划任务时通常不可用。

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

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

    net使用X:\\ComputerName\ShareName密码/用户:域名\AccountName/持久:否


    使用

    net use X:/delete/yes


    在命令提示符窗口中运行
    net使用/?
    获取此命令的帮助。

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

  • 因此,必须调查VB脚本在手动执行时运行良好,当前用户帐户的当前目录是批处理文件的目录,其中包含为当前用户帐户定义的环境变量,以及脚本访问的可能连接的网络驱动器和脚本调用的应用程序,以查找原因wh