批处理之家's Archiver

zqz0012005 发表于 2009-8-22 18:21

VBS中run和exec的区别

[size=3][font=Fixedsys]Set ws = CreateObject("WScript.Shell") '这里创建一个对象引用,以便在以下示例代码中使用。

语法:([size=2][color=lime]常识:[/color]作为过程使用时,不要加括号,否则出现编译器错误(参数唯一或没有时加括号不会出错,但建议不要加)[/size])
ws.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
[Set objExec =] ws.Exec(strCommand)

WScript.Shell对象的这两个方法都可以用来运行程序,且可以带参数。
都可以在程序路径中使用环境变量。
都不能为程序指定工作目录、不能设置优先级。start命令可以。
要指定工作目录,只能通过改变脚本宿主(WScript.exe/CScript.exe)的当前工作目录:ws.CurrentDirectory = "工作目录"
([size=2][color=lime]常识:[/color]工作目录有何意义:1、有些程序需要相应目录下的dll等相关文件支持 2、相对路径问题[/size])


[color=purple]1、run可以直接运行文件(包括协议文件),会启动相关联的程序打开该文件(没有关联则出错)。start有此功能(更高级,没有关联时会打开“打开方式”对话框)。
exec只能运行程序。[/color]
ws.run "c:\boot.ini"
ws.exec "notepad c:\boot.ini"

[color=purple]2、run不仅可以直接运行位于path环境变量目录中的程序,还能运行在注册表App Paths中设置的程序“别名”。start有此功能。
exec不行,只能直接运行位于path环境变量目录中的程序。[/color]
ws.run "iexplore"    'iexplore 在 App Paths 中登记了别名。
ws.exec "calc"

[color=purple]3、run可以等待程序运行结束再执行下面的命令。start有此功能。
exec不行。[/color]
ws.run "notepad", , true

[color=purple]4、exec运行的程序路径中即使含有空格,也可以不加引号(参数如需引号,它的引号不能省略)。
run、start没有这个本领。[/color]
([size=2][color=lime]常识:[/color]vbs中一个引号字符"本身要用两个引号表示,即写成""。也可以用Chr函数得到引号:chr(34)[/size])
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"""

[color=purple]5、最大的区别是:
run着重于启动控制(设置窗口形式)。(start听名字知道是为了启动,也可以简单设置窗口最大化、最小化。)
exec着重于后续控制,并着重于控制命令行程序。
run可以设置程序运行时的运行模式(前台后台:是否隐藏窗口)、窗口大小、激活状态(是否获取“焦点”),具体参数请参考手册[color=blue]《[url=http://www.bathome.net/thread-1985-1-1.html]Windows 脚本技术[/url]》(Script56.chm)[/color]中关于run方法的说明。
exec在启动程序后还能对其进行控制:获取运行状态、获取PID、强行中止进程。如果运行的是命令行程序,还能提供对 StdIn/StdOut/StdErr 流的访问:写入执行命令、获取命令输出等。运行命令行程序后只能通过StdIn写入命令,控制台窗口不再接受用户输入。[/color]

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[/font][/size]

[[i] 本帖最后由 zqz0012005 于 2009-8-24 20:09 编辑 [/i]]

zqz0012005 发表于 2009-8-22 19:58

exec的应用

[size=3]1、Runas自动输入密码[/size]
可能是设计时为安全考虑,runas不接收管道传递或从文件重定向得到,输入密码必须手动输入,这个问题困扰了不少人,却又难以解决,用Sendkeys也不一定稳妥。
如果用exec方法,就能轻松做到自动输入。[code]Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("cmd.exe")
oexec.StdIn.WriteLine "runas /user:username setup.bat"
oexec.StdIn.WriteLine "password"[/code][size=3]2、exec与run的结合使用[/size]
exec方法无法隐藏窗口,要得到命令行程序的输出,就会有一个黑呼呼的窗口一闪而过,不仅难看,还会让其他使用者误以为是木马什么的,很不完美。如何解决这个问题呢?就让exec与run合作吧![code]Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
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的结果会在控制台输出,不会弹出对话框。[/code]

rat 发表于 2009-8-23 10:32

回复 2楼 的帖子

以前用Exec执行cmd.exe,发现只有一个黑框,以为不能执行,原来是通过标准输入读入命令。

s700800900 发表于 2010-6-23 16:45

我有几个问题(语句我都能看懂,但不理解其中的意思):
1.LCase( right(host, len(host)-InStrRev(host,"\")) ) = "wscript.exe" 这一行应该是一直true的,然后会执行里面的ws.run "cscript """ & WScript.ScriptFullName & chr(34), 0。。这样不是会引起死循环吗?虽然有quit,但进程里应该是一直有一个cscript.exe在运行的。但实际上却没有
2.当运行到if内的时候,wscript.quit不是退出来了吗?为什么还会运行到msgbox这个函数?
3.从我的理解看,它是用run %0,0的形式隐藏的黑框框,这样理解对不?[code]Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
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"[/code]

zqz0012005 发表于 2010-6-23 21:26

回复 4楼 的帖子

1、你没看仔细,前面是wscript.exe,后面是cscript
2、见1就明白了
3、正解

s700800900 发表于 2010-6-25 00:08

明白了大概,算是wscript.exe 和cscript.exe之间的区别。。

pdanniel66 发表于 2010-9-19 11:58

I can not exec the below vbs. COuld you help me, thanks!
The 111.bat operation is normal.

Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("cmd.exe")
oexec.StdIn.WriteLine "runas /user:danch 111.bat"
oexec.StdIn.WriteLine "mypassword"

powerbat 发表于 2010-9-19 16:12

回复 7楼 的帖子

怎么才能从你的求助中得到一点有用的信息呢?
你电话或QQ或家庭地址是多少?bathome会员上门服务。

myzam 发表于 2011-3-21 20:30

[i=s] 本帖最后由 myzam 于 2011-3-21 20:32 编辑 [/i]

[b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=36647&ptid=5695]1#[/url] [i]zqz0012005[/i] [/b]

我个人认为run很exec方法的区别就一句话:
run 不返回对象
而exec返回对象。
看实例---调用记事本程序:[code]set oshell=createobject("wscript.shell")
set oexec=oshell.run ("notepad.exe")
msgbox oexe.processid

[/code]但你不能这样用run:[code]set oshell=createobject("wscript.shell")
set orun=oshell.run("notepad.exe")
msgbox orun.processid

[/code]run不返回对象,所以你只能这样用run:[code]set oshell=createobject("wscript.shell")
oshell.run "notepad.exe"
[/code]

myzam 发表于 2011-3-23 22:41

[i=s] 本帖最后由 myzam 于 2011-3-23 22:52 编辑 [/i]

[b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=36654&ptid=5695]2#[/url] [i]zqz0012005[/i] [/b]
输入密码根本不用这么做,用密码对象password就可以了。

看实例:语法:cmd中  运行  cscript +本脚本[code]
set objpwd=createobject("scriptpw.password")
wscript.stdout.writeline "please="
strpwd=objpwd.getpassword()
wscript.echo "pwd is:" &strpwd
[/code]

powerbat 发表于 2011-5-27 20:22

[b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=73314&ptid=5695]9#[/url] [i]myzam[/i] [/b]


你这个结论还用说吗?
那两个接口就是这么制定的,手册上已经写了。

就比如说,write的意思是写,read的意思是读,这就是它们的区别。这不废话吗?

powerbat 发表于 2011-5-27 20:27

[b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=73564&ptid=5695]10#[/url] [i]myzam[/i] [/b]

你有没有看清用这种方法的目的是什么?
exec的应用
1、Runas自动输入密码

你用scriptpw.password给Runas输入密码试试?

何况这个对象是让用户输入密码,作者的目的是脚本自动输入密码。南辕北辙。。。

Demon 发表于 2011-6-1 19:35

这个论坛中关于VBS的帖子就这个有点技术含量

Vurtne 发表于 2011-8-23 23:33

嗯 支持你 我在认真学VBS 我想让VBS门更火一点

wankoilz 发表于 2011-12-1 06:52

路过,觉得不错,顶一下!

happyxxdhaha 发表于 2015-3-12 20:44

[quote][code]Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec("cmd.exe")
oexec.StdIn.WriteLine "runas /user:username setup.bat"
oexec.StdIn.WriteLine "password"[/code][/quote]
2楼的这段代码不行。

Frank.Mu 发表于 2016-10-15 12:37

路过,感觉不错,顶一下!

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.