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