从VB中的进程捕获7-Zip输出和退出代码

时间:2014-05-02 15:37:56

标签: vb.net

我有以下VB.NET 4.0控制台应用程序,它在一个进程中运行7z.exe并使用压缩文件成功完成:

Public Sub CompressFiles(sZipFileName As String, sDriveLetter As String)

    Dim s7ZipCmdArgs As String = ""
    Dim myProcess As New Process

    Console.WriteLine()
    Console.WriteLine("Scanning files...")

    'Compress files
    s7ZipCmdArgs = " a -r -y -xr!windows\ -xr!$Recycle.Bin\ " + sZipFileName _
        + " " + sDriveLetter + "\*.txt" _
        + " " + sDriveLetter + "\*.doc" _
        + " " + sDriveLetter + "\*.xls" _
        + " " + sDriveLetter + "\*.ppt" _
        + " " + sDriveLetter + "\*.url" _
        + " " + sDriveLetter + "\*.docx" _
        + " " + sDriveLetter + "\*.xlsx" _
        + " " + sDriveLetter + "\*.pptx" _
        + " " + sDriveLetter + "\*.pdf" _
        + " " + sDriveLetter + "\*.wav" _
        + "> C:\test\zipresults.txt"

    myProcess.StartInfo.FileName = "C:\test\7-Zip\7z.exe"
    myProcess.StartInfo.Arguments = s7ZipCmdArgs
    myProcess.StartInfo.WorkingDirectory = "C:\test"
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.CreateNoWindow = True
    myProcess.Start()
    myProcess.WaitForExit()
End Sub

除了重定向到文本文件外,代码执行正常:s7ZipCmdArgs字符串变量中的“> C:\ test \ zipresults.txt”。我不确定为什么这不起作用,我尝试了不同的双重和三重引号,但没有成功。它在使用相同字符串的批处理文件中工作。

我的第二个问题是:如何捕获7Zip退出代码,以便确定它是否成功完成?它返回以下整数:0(无错误),1(非致命错误),2(致命错误),7(命令行错误),8(内存错误)和255(用户错误)。我不知道如何捕获整数,以便我可以解码它。

1 个答案:

答案 0 :(得分:3)

对于第一部分,您是否尝试在命令args中的>之前添加空格?您还可以查看this answer以捕获代码中的输出。

对于第一部分,根据this answer,使用>时,您无法使用Process.Start()重定向标准输出。因此,您需要从参数中删除重定向,将StartInfo.RedirectStandardOutput设置为true,然后将输出写入OutputDataReceived事件中的文件。像这样:

Dim pgm = "C:\Program Files\7-Zip\7z.exe"
Dim args = "l C:\Dev\Test.zip"
Dim myProcess = New Process()
With myProcess.StartInfo
    .FileName = pgm
    .Arguments = args
    .WorkingDirectory = "C:\Dev"
    .UseShellExecute = False
    .CreateNoWindow = True
    .RedirectStandardOutput = True
End With
Using out = New StreamWriter("C:\Dev\test.txt")
    AddHandler myProcess.OutputDataReceived,
        Sub(sender, e)
            out.WriteLine(e.Data)
        End Sub
    myProcess.Start()
    myProcess.BeginOutputReadLine()
    myProcess.WaitForExit()
End Using

对于第二个,myProcess.ExitCode将在WaitForExit()调用后生成结果。