VBS中Run和Exec的区别
Setws=CreateObject("WScript.Shell") '这里创建一个对象引用,以便在以下示例代码中使用。 'Demon注:这个变量名怎么这么猥琐(WS)
语法:(常识(Demon注:常识这个词我喜欢):作为过程使用时,不要加括号,否则出现编译器错误(参数唯一或没有时加括号不会出错,但建议不要加))
ws.Run(strCommand,[intWindowStyle],[bWaitOnReturn])
[SetobjExec=]ws.Exec(strCommand)
WScript.Shell对象的这两个方法:
都可以用来运行程序,且可以带参数。
都可以在程序路径中使用环境变量。
都不能为程序指定工作目录、不能设置优先级(start命令可以)。
要指定工作目录,只能通过改变脚本宿主(wscript.exe/cscript.exe)的当前工作目录:ws.CurrentDirectory="工作目录"。(常识:工作目录有何意义:1、有些程序需要相应目录下的dll等相关文件支持2、相对路径问题)
Run和Exec的区别:
1、Run可以直接运行文件(包括协议文件),会启动相关联的程序打开该文件(没有关联则出错)。start有此功能(更高级,没有关联时会打开“打开方式”对话框)。Exec只能运行程序。
ws.Run"c:\boot.ini" ws.Exec"notepadc:\boot.ini"
2、Run不仅可以直接运行位于path环境变量目录中的程序,还能运行在注册表AppPaths中设置的程序“别名”。start有此功能。Exec不行,只能直接运行位于path环境变量目录中的程序。
ws.Run"iexplore" 'iexplore在AppPaths中登记了别名。 ws.Exec"calc"
3、Run可以等待程序运行结束再执行下面的命令。start有此功能。Exec不行。
ws.Run"notepad",,true
4、Exec运行的程序路径中即使含有空格,也可以不加引号(参数如需引号,它的引号不能省略)。Run、start没有这个本领。(常识:vbs中一个引号字符"本身要用两个引号表示,即写成""。也可以用Chr函数得到引号:chr(34))
ws.Exec"C:\ProgramFiles\InternetExplorer\IEXPLORE.EXE"
ws.Exec"""C:\ProgramFiles\InternetExplorer\IEXPLORE.EXE"""
ws.Run """C:\ProgramFiles\InternetExplorer\IEXPLORE.EXE"""
5、最大的区别是:Run着重于启动控制(设置窗口形式)。(start听名字知道是为了启动,也可以简单设置窗口最大化、最小化。)Exec着重于后续控制,并着重于控制命令行程序。
run可以设置程序运行时的运行模式(前台后台:是否隐藏窗口)、窗口大小、激活状态(是否获取“焦点”),具体参数请参考手册。
Exec在启动程序后还能对其进行控制:获取运行状态、获取PID、强行中止进程。如果运行的是命令行程序,还能提供对StdIn/StdOut/StdErr流的访问:写入执行命令、获取命令输出等。运行命令行程序后只能通过StdIn写入命令,控制台窗口不再接受用户输入。
ws.Run"notepad",0
'隐藏窗口
ws.Run"notepad",4
'运行后不激活,不打扰原来的活动窗口
注意,手册上明确指出,Run不能约束所有程序都按它指定的窗口形式运行,有些程序不听它的话,比如iexplore、calc等。运行ieplore时,它会夺取焦点成为活动窗口。Run无法以最小化运行calc。
SetoExec=ws.Exec("mspaint") WScript.EchooExec.ProcessId oExec.Terminate WScript.EchooExec.Status'0为运行,1为结束 SetoExec=ws.Exec("ipconfig") WScript.EchooExec.StdOut.ReadAll
Exec的应用:
1、Runas自动输入密码:可能是设计时为安全考虑,runas不接收管道传递或从文件重定向得到,输入密码必须手动输入,这个问题困扰了不少人,却又难以解决,用Sendkeys也不一定稳妥(Demon注:我之前也说过很多次,用Sendkeys是不靠谱的,因为无法保证目标窗口一直获得焦点,但是经常见到很多人用,真是不明真相的群众,悲哀)。如果用Exec方法,就能轻松做到自动输入。
Setws=CreateObject("WScript.Shell") SetoExec=ws.Exec("cmd.exe") oexec.StdIn.WriteLine"runas/user:usernamesetup.bat" oexec.StdIn.WriteLine"password"
2、Exec与Run的结合使用:Exec方法无法隐藏窗口,要得到命令行程序的输出,就会有一个黑呼呼的窗口一闪而过,不仅难看,还会让其他使用者误以为是木马什么的,很不完美。如何解决这个问题呢?就让Exec与Run合作吧!
Setws=CreateObject("WScript.Shell") host=WScript.FullName 'Demon注:这里不用这么复杂吧,LCase(Right(host,11))不就行了 IfLCase(right(host,len(host)-InStrRev(host,"\")))="wscript.exe"Then ws.run"cscript"""&WScript.ScriptFullName&chr(34),0 WScript.Quit EndIf Setoexec=ws.Exec("ipconfig") MsgboxoExec.StdOut.ReadAll,,"ipconfig" '此时不要用WScript.Echo,因为当前是在控制台运行 'WScript.Echo的结果会在控制台输出,不会弹出对话框。
vbsRun方法
object.Run(strCommand,[intWindowStyle],[bWaitOnReturn])
【参数】
object
WshShell对象。
strCommand
表示要运行的命令行的字符串值。包括要传递到可执行文件的所有参数。
intWindowStyle
可选。表示程序窗口外观的整数值。
请注意,并非所有程序都使用此信息。
bWaitOnReturn
可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。
如果设为true,则在执行完程序后才执行脚本,Run方法返回由程序返回的任何错误代码。
如果设为false(默认值),则Run方法将自动在启动程序后立即返回0(不是错误代码)。
【说明】
Run方法返回一个整数。Run方法启动在新Windows进程中运行的程序。
可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。
strCommand参数内的环境变量自动扩展。
如果某个文件类型已正确注册到某个程序中,则对该类型的文件调用Run方法时将执行该程序。例如,如果您的计算机系统中装有Word,则对*.doc文件调用Run方法时将启动Word并加载该文档。
【intWindowStyle说明】
0隐藏一个窗口并激活另一个窗口。
1激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。
2激活窗口并将其显示为最小化窗口。
3激活窗口并将其显示为最大化窗口。
4按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。
5激活窗口并按当前的大小和位置显示它。
6最小化指定的窗口,并按照Z顺序激活下一个顶部窗口。
7将窗口显示为最小化窗口。活动窗口保持活动状态。
8将窗口显示为当前状态。活动窗口保持活动状态。
9激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。
10根据启动应用程序的程序状态来设置显示状态。
【示例1】
下面的VBScript代码用记事本打开当前运行脚本的副本。
SetWshShell=WScript.CreateObject("WScript.Shell") WshShell.Run"%windir%\notepad"&WScript.ScriptFullName
下面的VBScript代码与上述代码完成的操作相同,不同之处在于,它指定窗口类型,等待用户关闭记事本,关闭记事本时保存从记事本返回的错误代码。
SetWshShell=WScript.CreateObject("WScript.Shell")
Return=WshShell.Run("notepad"&WScript.ScriptFullName,1,true)
【示例2】
下面的VBScript代码打开一个命令窗口,将路径改为C:\,并执行DIR命令。
DimoShell SetoShell=WScript.CreateObject("WSCript.shell") oShell.run"cmd/KCDC:\&Dir" SetoShell=Nothing
Run方法:
Run方法有三个参数,
第一个参数是你要执行的程序的路径,
第二个参数是窗口的形式,0后台运行;1正常运行;2最小化;3最大化;缺省的话表示正常运行
第三个参数是表示这个脚本是等待还是继续执行,如果设为了True,脚本就会等待调用的程序退出后再向后执行。
例1:
Setws=CreateObject("WScript.Shell") ws.Run"notepad",,True ws.Run"iexplore"
例2:隐藏BAT执行窗口
Setws=CreateObject("WScript.Shell") ws.Run"x.bat",0
例3:
Setws=CreateObject("WScript.Shell") ws.Run"cmd/cnetstat-an>>x.txt",0
例4:
Setws=CreateObject("WScript.Shell") ws.Run"taskkill/f/imiexplore.exe",0
Exec方法
例1:运行文件
Setws=CreateObject("WScript.Shell")
ws.Exec"notepadc:/x.txt"‘对于Exec应指明程序,此notepad是必须的
例2:运行程序>获取进程PID值>强行结束进程(没有Run+taskkill强:如在记事本未保存的情况下结束进程,Exec会出错,而Run不会)>判断进程是否在运行(这个功能不错)
Setws=CreateObject("WScript.Shell") Sete=ws.Exec("notepad") MsgBoxe.ProcessId e.Terminate WSH.Sleep1000 MsgBoxe.Status‘0为运行,1为结束
例3:直接获取dos命令输出,dos窗口会闪一下,Exec没有窗口控制功能
Setws=CreateObject("WScript.Shell") Sete=ws.Exec("ipconfig") MsgBoxe.Stdout.ReadAll
例4:
Setws=CreateObject("WScript.Shell") Sete=ws.Exec("cmd/cechoHi") MsgBoxe.Stdout.ReadAll