VBS中Run和Exec的区别
Set ws = CreateObject("WScript.Shell")
'这⾥创建⼀个对象引⽤,以便在以下⽰例代码中使⽤。
'Demon注:这个变量名怎么这么猥琐(WS)
语法:(常识(Demon注:常识这个词我喜欢):作为过程使⽤时,不要加括号,否则出现编译器错误(参数唯⼀或没有时加括号不会出错,但建议不要加))
ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
[Set objExec =] ws.Exec(strCommand)
WScript.Shell对象的这两个⽅法:
都可以⽤来运⾏程序,且可以带参数。
都可以在程序路径中使⽤环境变量。
都不能为程序指定⼯作⽬录、不能设置优先级(start命令可以)。
要指定⼯作⽬录,只能通过改变脚本宿主(/)的当前⼯作⽬录:ws.CurrentDirectory = "⼯作⽬录"。(常识:⼯作⽬录有何意义:1、有些程序需要相应⽬录下的dll等相关⽂件⽀持 2、相对路径问题)
Run和Exec的区别:
1、Run可以直接运⾏⽂件(包括协议⽂件),会启动相关联的程序打开该⽂件(没有关联则出错)。start有此功能(更⾼级,没有关联时会打开“打开⽅式”对话框)。Exec只能运⾏程序。
ws.Run "c:\boot.ini"
ws.Exec "notepad c:\boot.ini"
2、Run不仅可以直接运⾏位于path环境变量⽬录中的程序,还能运⾏在注册表App Paths中设置的程序“别名”。start有此功能。Exec不⾏,只能直接运⾏位于path环境变量⽬录中的程序。
ws.Run "iexplore"
'iexplore 在 App Paths 中登记了别名。
ws.Exec "calc"
3、Run可以等待程序运⾏结束再执⾏下⾯的命令。start有此功能。Exec不⾏。
ws.Run "notepad", ,true
4、Exec运⾏的程序路径中即使含有空格,也可以不加引号(参数如需引号,它的引号不能省略)。Run、start没有这个本领。(常识:vbs中⼀个引号字符"本⾝要⽤两个引号表⽰,即写成""。也可以⽤Chr函数得到引号:chr(34))ws.Exec "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
ws.Exec """C:\Program Files\Internet Explorer\IEXPLORE.EXE"""
ws.Run  """C:\Program Files\Internet Explorer\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。
Set oExec = ws.Exec("mspaint")
WScript.Echo oExec.ProcessId
oExec.Terminate
WScript.Echo oExec.Status '0为运⾏,1为结束
Set oExec = ws.Exec("ipconfig")
WScript.Echo oExec.StdOut.ReadAll
Exec的应⽤:
1、Runas⾃动输⼊密码:可能是设计时为安全考虑,runas不接收管道传递或从⽂件重定向得到,输⼊密码必须⼿动输⼊,这个问题困扰了不少⼈,却⼜难以解决,⽤Sendkeys也不⼀定稳妥(Demon注:我之前也说过很多次,⽤Sendkeys是不靠谱的,因为⽆法保证⽬标窗⼝⼀直获得焦点,但是经常见到很多⼈⽤,真是不明真相的众,悲哀)。如果⽤Exec⽅法,就能轻松做到⾃动输⼊。
Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("")
oexec.StdIn.WriteLine "runas /user:username setup.bat"
oexec.StdIn.WriteLine "password"
2、Exec与Run的结合使⽤:Exec⽅法⽆法隐藏窗⼝,要得到命令⾏程序的输出,就会有⼀个⿊呼呼的窗⼝⼀闪⽽过,不仅难看,还会让其他使⽤者误以为是⽊马什么的,很不完美。如何解决这个问题呢?就让Exec与Run合作吧!
Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
'Demon注:这⾥不⽤这么复杂吧,LCase(Right(host, 11))不就⾏了
If LCase( right(host, len(host)-InStrRev(host,"\")) ) = "" Then
ws.run "cscript """ & WScript.ScriptFullName & chr(34), 0
WScript.Quit
End If
Set oexec = ws.Exec( "ipconfig")
Msgbox oExec.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 代码⽤记事本打开当前运⾏脚本的副本。
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%windir%\notepad " & WScript.ScriptFullName
下⾯的 VBScript 代码与上述代码完成的操作相同,不同之处在于,它指定窗⼝类型,等待⽤户关闭记事本,关闭记事本时保存从记事本返回的错误代码。
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("notepad " & WScript.ScriptFullName, 1, true)
【⽰例 2】
下⾯的 VBScript 代码打开⼀个命令窗⼝,将路径改为 C:\,并执⾏ DIR 命令。
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "cmd /K CD C:\ & Dir"
Set oShell = Nothing
Run ⽅法:
Run⽅法有三个参数,
第⼀个参数是你要执⾏的程序的路径,
第⼆个参数是窗⼝的形式,0后台运⾏;1正常运⾏;2最⼩化;3最⼤化;缺省的话表⽰正常运⾏
第三个参数是表⽰这个脚本是等待还是继续执⾏,如果设为了True,脚本就会等待调⽤的程序退出后再向后执⾏。
例1:
Set ws = CreateObject("WScript.Shell")
ws.Run "notepad",,True
ws.Run "iexplore"
例2:隐藏BAT执⾏窗⼝
Set ws = CreateObject("WScript.Shell")
ws.Run "x.bat",0
例3:
Set ws = CreateObject("WScript.Shell")
ws.Run "cmd /c netstat -an>&",0
例4:
Set ws = CreateObject("WScript.Shell")
ws.Run "taskkill /f /",0
Exec ⽅法
例1:运⾏⽂件
vbs小程序代码大全Set ws = CreateObject("WScript.Shell")
ws.Exec "notepad c:/x.txt" ‘对于Exec应指明程序,此notepad是必须的
例2:运⾏程序>获取进程PID值>强⾏结束进程(没有Run+taskkill强:如在记事本未保存的情况下结束进程,Exec会出错,⽽Run不会)>判断进程是否在运⾏(这个功能不错)
Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("notepad")
MsgBox e.ProcessId
e.Terminate
WSH.Sleep 1000
MsgBox e.Status ‘0为运⾏,1为结束
例3:直接获取dos命令输出,dos窗⼝会闪⼀下,Exec没有窗⼝控制功能
Set ws = CreateObject("WScript.Shell")
Set e = ws.Exec("ipconfig")
MsgBox e.Stdout.ReadAll
例4:
Set ws = CreateObject("WScript.Shell") Set e = ws.Exec("cmd /c echo Hi") MsgBox e.Stdout.ReadAll

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。