none
使用Process对象时,如何获得控制台程序处理进度? RRS feed

  • 问题

  • 在命令提示符下:输出是这样的

    G:\Windows PE>dism /unmount-wim /mountdir:src /discard

    部署映像服务和管理工具
    版本: 6.3.9600.16384

    映像文件 : G:\USB.wim
    映像索引 : 1
    正在卸载映像
    [==========================100.0%==========================]
    操作成功完成。

    G:\Windows PE>

    我在VB.NET里面重定向了标准输出流,代码如下。

        Private Sub Test()
    
            Dim p As New Process
            p.StartInfo.FileName = "Dism"
            p.StartInfo.Arguments = "/unmount-wim /mountdir:""G:\Windows Pe\Src"" /discard"
            p.StartInfo.CreateNoWindow = True
            p.StartInfo.RedirectStandardOutput = True
            p.StartInfo.RedirectStandardError = True
            p.StartInfo.UseShellExecute = False
            AddHandler p.OutputDataReceived, AddressOf DataRecv
            p.Start()
            p.BeginOutputReadLine()
    
        End Sub
    
        Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If Not IsNothing(e.Data) Then Temp = Temp & e.Data
            If p.HasExited Then MsgBox("已执行完毕!")
        End Sub

    执行 Test以后,输出结果Temp:

    部署映像服务和管理工具
    版本: 6.3.9600.16384

    映像文件 : G:\USB.wim
    映像索引 : 1
    正在卸载映像
    操作成功完成。

    这个时候处理进度信息没了([==========================100.0%==========================])。

    请问怎么才能获取这个进度信息?


    2013年12月14日 4:11

全部回复

  • 您好:

    尝试输出Temp可以吗

    Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If Not IsNothing(e.Data) Then
              Temp = Temp & e.Data
              //输出Temp的内容
            End If
     End Sub

    另外建议退出程序可以用Exited事件处理,详情可以看:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.exited(v=vs.110).aspx

    我模拟做了一个程序(用内置命令dir),结果每次输出到控制台,都会显示进度:

    Module Module1
        Sub Main()
            Dim p As New Process()
            p.StartInfo.FileName = "cmd.exe"
            p.StartInfo.CreateNoWindow = True
            p.StartInfo.RedirectStandardOutput = True
            p.StartInfo.RedirectStandardInput = True
            p.StartInfo.RedirectStandardError = True
            p.StartInfo.UseShellExecute = False
            AddHandler p.OutputDataReceived, AddressOf DataRecv
            AddHandler p.Exited, AddressOf ProgramExited
            p.Start()
            p.BeginOutputReadLine()
            p.StandardInput.WriteLine("dir d:\")
            p.WaitForExit(5000)
        End Sub
        Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If (e.Data IsNot NothingThen
                Console.WriteLine("已经获得数据……:" & e.Data)
            End If
        End Sub
     
        Private Sub ProgramExited(sender As Object, e As EventArgs)
            Console.WriteLine("全部处理完毕")
        End Sub
    End Module

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search

    2013年12月14日 7:16
    版主
  • 您好:

    尝试输出Temp可以吗

    Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If Not IsNothing(e.Data) Then
              Temp = Temp & e.Data
              //输出Temp的内容
            End If
     End Sub

    另外建议退出程序可以用Exited事件处理,详情可以看:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.exited(v=vs.110).aspx

    我模拟做了一个程序(用内置命令dir),结果每次输出到控制台,都会显示进度:

    Module Module1
        Sub Main()
            Dim p As New Process()
            p.StartInfo.FileName = "cmd.exe"
            p.StartInfo.CreateNoWindow = True
            p.StartInfo.RedirectStandardOutput = True
            p.StartInfo.RedirectStandardInput = True
            p.StartInfo.RedirectStandardError = True
            p.StartInfo.UseShellExecute = False
            AddHandler p.OutputDataReceived, AddressOf DataRecv
            AddHandler p.Exited, AddressOf ProgramExited
            p.Start()
            p.BeginOutputReadLine()
            p.StandardInput.WriteLine("dir d:\")
            p.WaitForExit(5000)
        End Sub
        Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If (e.Data IsNot NothingThen
                Console.WriteLine("已经获得数据……:" & e.Data)
            End If
        End Sub
     
        Private Sub ProgramExited(sender As Object, e As EventArgs)
            Console.WriteLine("全部处理完毕")
        End Sub
    End Module

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search

    不是这个进度,你可以尝试一下dism挂载命令,或者格式化命令。有百分比的都无法显示当前获取的时候处理到多少了。

    另外:p.EnableRaisingEvents = True 才会触发Exited事件。

    • 已编辑 fcspro 2013年12月14日 7:34
    2013年12月14日 7:31
  • 抱歉!格式化命令是可以的。但是DISM的就不行

        Private Sub BtnTest_Click(sender As Object, e As EventArgs) Handles BtnTest.Click
            TestFormat()
        End Sub
    
        Private Sub TestFormat()
            TBResult.Text = ""
            Dim p As New Process
            With p.StartInfo
                .FileName = "cmd.exe"
                .CreateNoWindow = True
                .UseShellExecute = False
                .RedirectStandardInput = True
                .RedirectStandardOutput = True
            End With
            AddHandler p.OutputDataReceived, AddressOf DataRecv
            AddHandler p.Exited, AddressOf Process_Exited
            p.Start()
            p.BeginOutputReadLine()
            p.StandardInput.WriteLine("dism /unmount-wim /mountdir:""g:\windows pe\src"" /discard")
            'p.StandardInput.WriteLine("format h: /y")
            p.StandardInput.WriteLine("Exit")
            p.EnableRaisingEvents = True
    
        End Sub
        Private Sub DataRecv(sender As Object, e As DataReceivedEventArgs)
            If Not IsNothing(e.Data) Then BeginInvoke(New EventHandler(AddressOf ShowText), e.Data)
        End Sub
    
        Private Sub Process_Exited(sender As Object, e As EventArgs)
            BeginInvoke(New EventHandler(AddressOf ShowText), "已退出。")
        End Sub
    
        Private Sub ShowText(sender As Object, e As EventArgs)
            TBResult.AppendText(sender.ToString & vbCrLf)
        End Sub

    执行结果如下:

    但是直接用命令提示符(管理员),执行结果如下:


    • 已编辑 fcspro 2013年12月14日 8:18
    2013年12月14日 8:12
  • 可能是个案吧。
    2013年12月16日 7:58
  • 你的答案不是很完整,如果可以提供完整的描述并且描述就好了,谢谢!

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search

    2013年12月17日 2:15
    版主