如何捕获shell引起的错误?

本命雪狮 2012-12-07 04:45:30
比如我用shell调用net use命令,但是无法捕获其执行的错误.
有没有方法捕获错误或者用可以捕获错误的其他方法替代shell?
谢谢!
...全文
383 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 元老 2012-12-13
  • 打赏
  • 举报
回复
你要是调用CMD中的很多命令的话,应该使用管道通信。 以前写过: Imports System.IO Imports System.Threading Public Class ReIntOutStream Private myProcess As Process '子进程 Private myThread As Thread '循环线程 Private myStreamWriter As StreamWriter '子进程写入流 Private myStreamRead As StreamReader '子进程读取流 Event ReadLine(ByVal Info As String) '读到一行数据 ''' <summary> ''' 创建子进程并重定向其输入、输出流以供程序处理 ''' </summary> ''' <param name="ExePath">子进程所在目录(支持转义符),应以"\"结束;当进程位于系统环境变量所指示的目录时,可将此值设置为String.Empty。</param> ''' <param name="ExeName">子程序文件名</param> ''' <param name="CreateNoWindow">是否使用无窗口模式</param> ''' <param name="WorkingDirectory">是否设置子进程工作目录为ExePath参数所指定的目录,设置此目录可解决某些程序使用工作目录下文件的问题</param> ''' <remarks>要接收子进程返回的内容应处理PipeReadLine事件</remarks> Sub New(ByVal ExePath As String, ByVal ExeName As String, Optional ByVal CreateNoWindow As Boolean = True, Optional ByVal WorkingDirectory As Boolean = True) '定义子进程并设置其参数 myProcess = New Process() '创建一个进程 myProcess.StartInfo.FileName = ExePath & ExeName '要启动的程序,如果文件位于系统Path内,则第一个参数可设置为String.Empty myProcess.StartInfo.CreateNoWindow = CreateNoWindow '创建无窗口模式,这要比创建隐藏窗口的代码运行起来更稳定 If WorkingDirectory Then '对于某些程序,它直接调用自身工作目录下的文件,如果不设置该值(为String.Empty)将出现错误 myProcess.StartInfo.WorkingDirectory = ExePath End If '允许重定义子进程输入输出流 myProcess.StartInfo.UseShellExecute = False '是否启动外壳程序,只有当不启动时,才可以重定向输入、输出、错误流 myProcess.StartInfo.RedirectStandardInput = True '允许重定向输入流 myProcess.StartInfo.RedirectStandardOutput = True '允许重定向输出流 myProcess.Start() '启动该进程 '重定义输入输出流 myStreamWriter = myProcess.StandardInput '重定义输入流,以用我们的写入流向其该进程输入内容 myStreamRead = myProcess.StandardOutput '重定义输出流,以用我们的读取流获得该进程输出内容 '启动新线程实现读取信息 myThread = New Thread(AddressOf ReadInfo) '为方便处理子进程返回的信息,循环读取以引发事件的方式来处理 myThread.Start() End Sub ''' <summary>运行指定的命令</summary> ''' <param name="cmd">命令内容</param> ''' <remarks>命令内容无需以回车、换行或回车换行符结束</remarks> Public Sub SendCommand(ByVal cmd As String) myStreamWriter.WriteLine(cmd) '向写入流写入命令(无需加入回车、换行等即可自动执行),以使子进程执行 End Sub '用一个循环读取子进程返回的内容并引发PipeReadLine事件以将其传递给调用者 Private Sub ReadInfo() Do Until myProcess.HasExited '循环读取直到子进程退出时终止线程 Try '由于这个流不支持Peek方法,所以只能测试读回值是不是Nothing Dim Info As String = myStreamRead.ReadLine() If Info <> String.Empty Then RaiseEvent ReadLine(Info) Catch ex As Exception MsgBox(ex.ToString, , "发生错误: " & Err.Number) End Try Loop If myThread IsNot Nothing Then myThread.Join(1000) myThread = Nothing End If End Sub '退出 Public Sub Close() If Not myProcess.HasExited Then myProcess.Kill() End Sub End Class 窗体,添加一个文本框,一个listbox: Public Class FrmMain Dim WithEvents p As New ReIntOutStream(String.Empty, "cmd") Private Sub p_PipeReadLine(ByVal Info As String) Handles p.ReadLine ListBox1.Items.Add(Info) ListBox1.SelectedIndex = ListBox1.Items.Count - 1 End Sub Private Sub FrmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing p.Close() End Sub Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.KeyCode = Windows.Forms.Keys.Enter Then p.SendCommand(TextBox1.Text) End Sub Private Sub FrmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load CheckForIllegalCrossThreadCalls = False End Sub End Class
threenewbee 2012-12-07
  • 打赏
  • 举报
回复
net use对应NPAddConnection API函数 http://msdn.microsoft.com/en-us/library/aa378783(v=vs.85).aspx
Jia_H 2012-12-07
  • 打赏
  • 举报
回复
这个对你或许有用: http://stackoverflow.com/questions/6397435/how-to-i-read-cmd-output-in-vb-net-from-cmd-shell

16,554

社区成员

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

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