注册 登录
编程论坛 VB6论坛

Shell DOS Command 的问题

wube 发布于 2018-11-09 18:05, 1977 次点击
一般来说下cmd /c 是表示执行完就关闭视窗
所以在VB都写成
程序代码:

    pID = Shell("cmd /c C:\1\1.bat", vbHide)
    Do
        If GetProcessVersion(pID) = 0 Then Exit Do
        MyDoEvents 1000
    Loop


那如果我想要撷取DOS视窗内的资料到剪贴簿上,再存出来那要怎么写?
程序代码:

    pID = Shell("cmd /k C:\1\1.bat", vbHide)'执行结束不关闭视窗
    '--------------------------------------------------------------------------->>
    Do
        If GetProcessVersion(pID) = 0 Then Exit Do'那我怎么知道他什么时候会跑完?
        MyDoEvents 1000
    Loop
    '---------------------------------------------------------------------------<<
    Clipboard.Clear
    AppActivate pID
    SendKeys "%{ }eS%{ }eY"
    Text1.Text = Clipboard.GetText
   
    SendMessage pID, SC_CLOSE, 0, 0


中间那段要怎么写才能去判断?
5 回复
#2
风吹过b2018-11-10 08:34
pID = Shell("cmd /C C:\1\1.bat > """ & app.path & "\tmp.tmp""" , vbHide)
把执行结果写入到一个临时文件中,
然后检查这个PID是否存在系统中,直到这个PID消失才知道这个DOS执行完成了。
打开这个文件 文件就是执行结果。


#3
wube2018-11-10 14:58
我希望能将执行和写入分成两个动作,因为实际测试,我Bat内执行数千行指令,完成动作非常耗时,
所以猜测是否实际动动是每执行一行指令,档案就被覆写一次,因为单纯在DOS视窗执行指令时速度不慢,
但是让写入档案一起时,就变得很慢。所以想把两个动作分开做,借此验证是否真的是这个原因。

不知道如何实现,pID是DOS视窗句柄,能否透过API将DOS视窗内容输出到档案内?最后再用API去删除DOS视窗?
#4
wube2018-11-10 15:11
我查过">"等于Output,">>"等于Append,假使有一千行指令就变成
For I=0 to 1000
open 1.txt for output as #1 或 open 1.txt for append as #1
......
close #1
next I

我希望能把IO降到一次输出档案
#5
风吹过b2018-11-10 15:44
以前看过,可以重定向 dos 输出的重定向。
但忘了它是怎么做的。
搜索一下看看
#6
wube2018-11-10 19:24
以下是引用wube在2018-11-10 15:11:06的发言:

我查过">"等于Output,">>"等于Append,假使有一千行指令就变成
For I=0 to 1000
open 1.txt for output as #1 或 open 1.txt for append as #1
......
close #1
next I

我希望能把IO降到一次输出档案


从别处问到,真的是一千次写档,不过也问到解法,可以变成一次IO处理的方式
超简单,就是外面再包一层BAT就解决了。
内层的BAT只管指令执行,内层Bat执行完毕回到外层Bat再一次输出全部资料。

用Cmd /c Bat Call Bat > 档案的方式,巧妙的避开多次IO存取问题。
1