这里就启动VB.NET shell程序,并将其输出截获做出了详细的代码分析,执行并返回一个命令行程序(shell程序)的标准输出和标准错误输出'通常命令行程序的所有输出都直接送到屏幕上。
VB.NET通过长期的开展,许多用户都很了解VB.NET了,这儿我宣布一下个人了解,和咱们评论评论。在Windows环境下的所谓shell程序便是dos命令行程序,比方VC的CL.exe命令行编译器,JDK的javac编译器,发动java程序用的java.exe都是规范的shell程序。截获一个shell程序的输出是很有用的,比方说您能够自己编写一个IDE(集成开发环境),当用户宣布编译指令时分,你能够在后台发动shell调用编译器并截获它们的输出,对这些输出信息进行剖析后在更为友爱的用户界面上显示出来。为了便利起见,咱们用VB作为本文的演示言语。
#T#一般,体系发动Shell程序时缺省给定了3个I/O信道,规范输入(stdin),规范输出stdout,规范过错输出stderr。之所以这么区别是因为在前期的计算机体系如PDP-11的一些约束。那时没有GUI,将输出分为stdout,stderr能够防止程序的调试信息和正常输出的信息稠浊在一起。一般,shell程序把它们的输出写入规范输出管道(stdout)、把犯错信息写入规范过错管道(stderr)。缺省情况下,体系将管道的输出直接送到屏幕,这样一来咱们就能看到应用程序运转成果了。为了捕获一个规范控制台应用程序的输出,咱们有必要把standOutput和standError管道输出重定向到咱们自定义的管道。
下面的代码能够发动一个VB.NET shell程序,并将其输出截获。履行并回来一个命令行程序(shell程序)的规范输出和规范过错输出'一般命令行程序的一切输出都直接送到屏幕上
- PrivateFunctionExecuteApp(sCmdlineAsString)
- AsStringDimprocAsPROCESS_INFORMATION,
- retAsLongDimstartAsSTARTUPINFO
- DimsaAsSECURITY_ATTRIBUTESDimhReadPipeAsLong'担任读取的管道
- DimhWritePipeAsLong'担任Shell程序的规范输出和规范过错输出的管道
- DimsOutputAsString'放回来的数据
- DimlngBytesReadAsLong,
- sBufferAsString*256sa.nLength=Len(sa)
- sa.bInheritHandle=Trueret=CreatePipe(hReadPipe,
- hWritePipe,sa,0)Ifret=0ThenMsgBox
- "CreatePipefailed.Error:"&Err.LastDllErrorExitFunction
- EndIfstart.cb=Len(start)
- start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW'把规范输出和规范过错输出重定向到同一个管道中去。
- start.hStdOutput=hWritePipestart.hStdError=hWritePipestart.wShowWindow=SW_HIDE'隐含shell程序窗口'发动shell程序,sCmdLine指明履行的途径
- ret=CreateProcessA(0&,sCmdline,sa,sa,
- True,NORMAL_PRIORITY_CLASS,_0&,0&,start,proc)
- Ifret=0ThenMsgBox"无法树立新进程,过错码:
- "&Err.LastDllErrorExitFunctionEndIf'本例中不必向shell程序送信息,因而能够先封闭
- hWritePipeCloseHandlehWritePipe'循环读取shell程序的输出,每次读取256个字节。
- Doret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)
- sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)LoopWhileret<>0'假如ret=0代表没有更多的信息需求读取了'开释相关资源
- CloseHandleproc.hProcessCloseHandleproc.hThreadCloseHandlehReadPipeExecuteApp=sOutput'输出成果EndFunction
我对这个程序进行一些解说。
- ret=CreatePipe(hReadPipe,hWritePipe,sa,0)
再把VB.NET shell程序的规范输出和规范过错输出都定向到咱们预先建好的管道中。
代码如下:
- start.dwFlags=STARTF_USESTDHANDLESOrSTARTF_USESHOWWINDOW
- start.hStdOutput=hWritePipe
- start.hStdError=hWritePipe
好,现在能够调用树立新进程的函数了:
- ret=CreateProcessA(0&,sCmdline,sa,sa,True,NORMAL_PRIORITY_CLASS,0&,0&,start,proc)
然后,循环读管道里的数据直到无数据可读停止。
- Do
- ret=ReadFile(hReadPipe,sBuffer,256,lngBytesRead,0&)'每次读256字节
- sOutputsOutput=sOutput&Left$(sBuffer,lngBytesRead)'送入一个字符串中
- LoopWhileret<>0'若ret=0标明没有数据等候读取。
然后,开释不必的资源。
VB.NET shell程序用法很简单:比方:
- MsgBoxExecuteApp("c:\windows\command\mem.exe)
知优网 » 快速运用VB.NET shell程序(vb.net shell函数)