我有一个正在运行的计划任务,但它似乎无法正常工作。此任务执行批处理文件。批处理文件只包含一行:
wscript c:\myfolder/myscript.vbs
此VBScript文件启动命令提示符,执行vpncli
,休眠一分钟,然后继续设置连接,将用户名/密码发送到命令行窗口。
从命令提示符窗口运行批处理文件时,这可以正常工作,但使用计划任务没有成功。它运行任务的帐户是服务管理帐户。运行任务后,我会在单独的命令行窗口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
答案 0 :(得分:5)
使用只有一个命令行的批处理文件作为计划任务通常没有多大意义。最好直接在预定作业中指定运行批处理文件执行的应用程序及其参数,在这种情况下%SystemRoot%\System32\wscript.exe
参数为"C:\myfolder\myscript.vbs"
。
在仅使用控制台应用程序时,最好使用cscript
- Windows脚本宿主的控制台版本 - 而不是wscript
- Windows GUI版本的Windows脚本宿主。在命令提示符窗口cscript /?
中运行时会显示对这两个应用程序的帮助,并在GUI窗口中显示帮助,将帮助输出直接导入控制台窗口和wscript /?
。
在按计划任务运行时必须至少考虑4个点:
在计划任务的属性中配置的用户帐户。
使用的帐户确定本地磁盘以及网络共享上的权限。例如,本地管理员或系统帐户通常不具有本地网络上任何资源的访问权限,但可以完全访问本地驱动器上的任何目录。它还定义了可用的环境变量以及所有区域和语言相关的设置,例如命令date
和time
的日期和时间格式以及内置环境变量 DATE 和<强> TIME 强>
启动计划任务时设置的当前工作目录。
如果在计划任务的属性中未配置其他文件夹以用作文件夹中的“开始”,则启动计划任务的默认目录为%SystemRoot%\System32
。双击带有驱动器号的驱动器上的批处理文件时,批处理文件的目录是当前工作目录。批处理文件执行的任何脚本都应考虑到这一点。最好是编写独立于当前目录的脚本。
为计划任务定义的环境取决于使用的帐户。
系统环境变量用于所有用户帐户和用户帐户相关的环境变量。在使用其他用户帐户(如本地管理员或系统帐户)运行计划任务时,无法定义某些环境变量,这些变量是在使用自己的用户帐户运行相同脚本时定义的。建议尽可能使作为计划任务执行的脚本尽可能独立于环境变量,但Windows自动定义的系统变量除外SystemRoot
。维基百科文章Windows Environment Variables列出并描述了Windows定义的环境变量。
作为网络驱动器连接的网络共享通常在运行计划任务时不可用。
Windows存储在当前用户的注册表中,哪个网络共享作为网络驱动器持久连接。用户登录时,这些网络共享已连接(映射到驱动器号),并在用户注销时自动断开连接。使用与自己的帐户不同的帐户运行脚本作为计划任务会使网络驱动器不可用于脚本,因为网络共享既不是作为网络驱动器连接也不是其他帐户根本不可能访问网络资源。即使在已配置计划任务的属性中使用自己的用户帐户,网络驱动器也不可用,因为在运行计划任务之前没有登录,但计划任务配置为仅在用户登录时运行。登记/>
解决方案是在脚本UNC路径和具有网络资源或地图所需访问权限的帐户中使用,例如使用
net use X: \\ComputerName\ShareName password /user:DomainName\AccountName /persistent:no
驱动X:
的份额,并在退出脚本执行前断开连接
net use X: /delete
在命令提示符窗口net use /?
中运行以获取有关此命令的帮助。
通过在计划任务中使用具有网络共享访问权限的帐户,不必在(批处理)脚本中指定密码和帐户名称,这样更安全,否则对脚本文件具有读访问权限的每个人都可以看到未加密密码和帐户名称。 Windows将加密的计划任务的凭据存储起来。
因此VBScript在手动执行时工作正常,使用当前用户帐户,当前目录是批处理文件的目录,其中包含为当前用户帐户定义的环境变量,以及脚本访问的可能已连接的网络驱动器以及由必须调查脚本,以找出脚本无法作为计划任务使用为计划任务配置的属性的原因。