中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » VBS程序如何去传递或获取"批处理的执行结果"
作者:
标题: VBS程序如何去传递或获取"批处理的执行结果" 上一主题 | 下一主题
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『楼 主』:  VBS程序如何去传递或获取"批处理的执行结果"

程序如下:

set WshShell = CreateObject("WScript.Shell")

cmd=WshShell.run("CMD /c echo %time%", runhide)

msgbox cmd

为什么显示的结果是0,而不是批处理的执行结果17:02:28呢?

如何去提取批处理的执行结果?

2008-3-7 18:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

cmd为什么要是P的内容?
你知道run的返回值是什么麽?

你直接msgbox time不是更好麽?

2008-3-7 20:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 3 楼』:  呵呵,非也

我上面的程序是举例

在有些情况 ,使用批处理可能比使用脚本在代码上更简洁,或者说更容易,程序中的TIME只不过是举例而已,请不要误解噢!

从你的回答中看来,显示0,看来是顺利执行了运行批处理代码的而已,而不是批处理的执行结果.OK

就是想不通,有什么好的方法能够直接使用脚本语言捕获CMD执行结果????

[ Last edited by bd123456789 on 2008-3-7 at 09:11 PM ]

2008-3-7 21:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  

不过VBS的效率高。

比较容易想到的是2个方法,bat输出,vbs读取。

当参数调用。

2008-3-7 22:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 5 楼』:  


Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec    = WshShell.Exec("%comspec% /c echo %time%")

Function ReadAllFromAny(oExec)

     If Not oExec.StdOut.AtEndOfStream Then
          ReadAllFromAny = oExec.StdOut.ReadAll
          Exit Function
     End If

     If Not oExec.StdErr.AtEndOfStream Then
          ReadAllFromAny = oExec.StdErr.ReadAll
          Exit Function
     End If
     
     ReadAllFromAny = -1
End Function

Dim allInput, tryCount

allInput = ""
tryCount = 0

Do While True

     Dim input
     input = ReadAllFromAny(oExec)

     If -1 = input Then
          If tryCount > 10 And oExec.Status = 1 Then
               Exit Do
          End If
          tryCount = tryCount + 1
          WScript.Sleep 100
     Else
          allInput = allInput & input
          tryCount = 0
     End If
Loop

If oExec.ExitCode <> 0 Then
     WScript.Echo "Warning: Non-zero exit code"
End If

WScript.Echo allInput




第一高手    第二高手

2008-3-10 15:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 6 楼』:  ok

执行结果正确!
以后可以拿来作标准组件了,解决了不少问题!
OK OK

不过,因为VBS水平有限,不知道其中的工作原理?

能看得懂的,帮忙解释一下吗?

是不是利用VBS去读取内存呀?或者其它什么的?

2008-3-11 09:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 7 楼』:  

如果批处理有输出,可以直接获取:
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec    = WshShell.Exec("%comspec% /c dir")
WScript.Echo oExec.StdOut.ReadAll
发现没有隐藏cmd窗口的参数,运行的时候会跳出cmd窗口



2008-3-11 10:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by bd123456789 at 2008-3-11 09:43:
执行结果正确!
以后可以拿来作标准组件了,解决了不少问题!
OK OK

不过,因为VBS水平有限,不知道其中的工作原理?

能看得懂的,帮忙解释一下吗?

是不是利用VBS去读取内存呀?或者其它什么的?

这段代码Script56.chm
zh159兄的是简化代码,5楼完整代码还能返回Cmd执行错误提示,试试("%comspec% /c echo xxxx")就知道了



第一高手    第二高手

2008-3-11 11:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 9 楼』:  

简单测试了一下

5楼代码中间一大段主要功能是 当CMD程序执行发生错误时,能够将错误原因显示出来...

7楼的方法,太简洁了,OK

2008-3-11 17:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: