VBS中Run和Exec的区别

标签: , , , ,

难得见到一篇写得好点的中文的VBS文章,不复制粘贴对不起原作者。

Set ws = CreateObject("WScript.Shell")
'这里创建一个对象引用,以便在以下示例代码中使用。
'Demon注:这个变量名怎么这么猥琐(WS)

语法:(常识(Demon注:常识这个词我喜欢):作为过程使用时,不要加括号,否则出现编译器错误(参数唯一或没有时加括号不会出错,但建议不要加))

ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

[Set objExec =] 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 "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("cmd.exe")
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,"\")) ) = "wscript.exe" 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的结果会在控制台输出,不会弹出对话框。

全文完,原文地址:http://bbs.bathome.net/viewthread.php?tid=5695

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. 魔兽全屏补丁 魔兽宽屏补丁
  2. VBS图片处理之用VBS转化图片格式
  3. 又遇VBS中&H前缀十六进制数的陷阱
  4. 邪恶的eval和new Function
  5. C语言中的round函数

7 条评论 发表在“VBS中Run和Exec的区别”上

  1. azziporah说道:

    嗯,这个讲得够透彻,终于知道区别了

  2. azziporah说道:

    话说这个App Paths解开了我心中的一个疑惑
    我以前就很奇怪为什么Win+R WinWord或者PowerPNT可以直接打开Office
    原来注册表里还有个这么风骚的键,哈哈
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

  3. 晴云孤魂说道:

    最后一个观点解释了我的疑惑

  4. prophetk说道:

    有点像C#里的System.Diagnostics

  5. xx说道:

    runas那个不行啊
    stdin是捕获控制台输入的

    Example
    The following samples will read a line of text from the keyboard and display whatever was typed when the end of the line is seen.
    [VBScript]
    Dim Input
    Input = “”

    Do While Not WScript.StdIn.AtEndOfLine
    Input = Input & WScript.StdIn.Read(1)
    Loop
    WScript.Echo Input
    [JScript]
    var input = “”;
    while (!WScript.StdIn.AtEndOfLine)
    {
    input += WScript.StdIn.Read(1);
    }
    WScript.Echo(input);

    不能干着事啊

  6. ss说道:

    你好。请问,有没有vbs 下telnet的方法啊?Sendkeys太靠不住了。

  7. cuisanzhang说道:

    Runas自动输入密码:那个无效, 请问怎么会这样啊

azziporah 留下回复