关于 ProcessStartInfo 的使用,如果显示被调用exe的输出信息?

wxylvmnn 2015-06-01 01:12:52

现在有一个exe,
比如叫XX.exe,这个exe是现成的,没有源代码。
通过使用的时候,
通过dos窗口,直接调用的话,
这个XX.exe在执行的过程中,会输出一些信息。

现在,我想给这个XX.exe做了一个壳,加一些执行前的check。
这个壳执行XX.exe时,新开,或者不新开窗口均可。

问题出在,如何才能保证XX.exe原有的输出信息,都正常输出,能被用户正常看到?

代码如果写成这样的话,会新开一个新窗口,
在新窗口中,能正常输出XX.exe的输出信息,但是执行完,还没等看清楚,窗口立马就关掉了。
有什么办法,不让弹出的这个窗口关掉么?
Dim p As Process = New Process()
Dim startInfo As New ProcessStartInfo()
startInfo.FileName = "H:\XX.exe"
startInfo.Arguments = My.Application.CommandLineArgs(0)
p.StartInfo = startInfo
p.Start()
p.WaitForExit()
p.Close()

我要是加上下面这些代码的话,不会创建新窗口,
但是XX.exe很明显没有被调用起来。

startInfo.UseShellExecute = False '不使用系统外壳程序启动
startInfo.RedirectStandardInput = False '不重定向输入
startInfo.RedirectStandardOutput = true '重定向输出
startInfo.CreateNoWindow = False '不创建窗口

这样的问题,有什么好的解决方法么?
...全文
767 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxylvmnn 2015-06-02
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
@echo off
XXplus.exe %1
IF %ERRORLEVEL%==1 GOTO END
XX.exe %1
XXclear.exe %1
:END
XX.exe 没结束之前是不会执行 XXclear.exe 的。
恩,如果实在实现不了的话,只能按照你说的这样,把现在的拆成2个了。。 谢谢了哈~
Tiger_Zhao 2015-06-02
  • 打赏
  • 举报
回复
@echo off
XXplus.exe %1
IF %ERRORLEVEL%==1 GOTO END
XX.exe %1
XXclear.exe %1
:END

XX.exe 没结束之前是不会执行 XXclear.exe 的。
wxylvmnn 2015-06-02
  • 打赏
  • 举报
回复
引用 5 楼 Tiger_Zhao 的回复:
你的程序只做check
If 校验通过 Then
    Environment.ExitCode = 0
Else
    Environment.ExitCode = 1
End If
通过批处理xx.bat来启动
@echo off
XXplus.exe %1
IF %ERRORLEVEL%==0 XX.exe %1
额,在壳上再套一层壳啊。。 其实需求是这样的,我最开始说的有点简化了。 XX.exe本身,根据参数,会执行一系列的数据库 更新操作。 最开始这个XX.exe拿来用的时候,因为只有一个用户,所以没有问题。 现在多个用户同时使用,就出现了,第一个人执行的结果,被第二个人覆盖的情况。 所以想通过壳,来进行控制。 现在的实现方法是这样的, ※前提,我在库里新作了一个叫onlyOne的表,表里就一个字段。 1,判断onlyOne是否有数据,如果有数据,就说明有人在操作,提示【某某人正在操作】 2,如果onlyOne没有数据,就把自己的信息插入。 3,执行XX.exe。※通常,XX.exe需要执行3分钟左右,在这期间,不断的通过dos窗口,把更新结果输出到dos界面上。 4,执行完毕后,清空onlyOne表的数据。 如果用dos的话,我现在就得做2个校验的了,一个是上面的1,2步,一个是上面的4步。
wxylvmnn 2015-06-02
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
也就是说,你只负责p.Start() 不要管它什么时候执行完,也不要关掉. p.WaitForExit() p.Close() 这两句都去掉
按照你提示的, 我把waitforexist和close都注释掉了, 弹出的窗口,在输出最后一条信息后,还是关闭了。 我觉得是我现在的思路有问题, 必须同一窗口显示才行,不能用弹出的, 因为XX.exe本身代码里应该已经写了关闭的代码。 不用我做的壳,dos里执行XX.exe,效果是这样的。 c:\users\xx1>XX.exe parm1 XX.exe的输出信息1 XX.exe的输出信息2 。。。 XX.exe的输出信息n c:\users\xx1> 所以,看来在弹出的新窗口中,控制不了,不让它关闭。
ccm1818168 2015-06-02
  • 打赏
  • 举报
回复
process
於黾 2015-06-01
  • 打赏
  • 举报
回复
也就是说,你只负责p.Start() 不要管它什么时候执行完,也不要关掉. p.WaitForExit() p.Close() 这两句都去掉
於黾 2015-06-01
  • 打赏
  • 举报
回复
p.Close() 你这不就把它关了?? 不要用代码关掉它,让用户想什么时候关就什么时候关不就得了
Tiger_Zhao 2015-06-01
  • 打赏
  • 举报
回复
你的程序只做check
If 校验通过 Then
Environment.ExitCode = 0
Else
Environment.ExitCode = 1
End If

通过批处理xx.bat来启动
@echo off
XXplus.exe %1
IF %ERRORLEVEL%==0 XX.exe %1
wxylvmnn 2015-06-01
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
重定向输出。这个帖子的#4
这个试了一下,还是有问题。 1,一执行,就提示句柄无效。这个是因为XX.exe自身的代码问题?无从知晓啊。。 2,这没完事,居然继续执行了,输出了XX.exe的第一行输出信息,然后就退出了,剩下的信息都没了。
Tiger_Zhao 2015-06-01
  • 打赏
  • 举报
回复
重定向输出。这个帖子的#4
wxylvmnn 2015-06-01
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
Shell("H:\XX.exe " & My.Application.CommandLineArgs(0),vbNormalFocus)
这样写是可以,但是有个问题。 运行里输入CMD,回车,显示DOS窗口。 c:\users\xx1> 然后我输入我做的外壳程序 c:\users\xx1>XXplus.exe parm1 回车以后, 希望得到的效果是: c:\users\xx1>XXplus.exe parm1 XX.exe的输出信息1 XX.exe的输出信息2 。。。 XX.exe的输出信息n 但现在的效果变成了: c:\users\xx1>XXplus.exe parm1 c:\users\xx1>XX.exe的输出信息1←这里的c:\users\xx1>是多余的 XX.exe的输出信息2 。。。 XX.exe的输出信息n
Tiger_Zhao 2015-06-01
  • 打赏
  • 举报
回复
Shell("H:\XX.exe " & My.Application.CommandLineArgs(0),vbNormalFocus)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧