捕获7-Zip输出和退出代码,从一个进程在VB



我有以下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:testzipresults.txt"
    myProcess.StartInfo.FileName = "C:test7-Zip7z.exe"
    myProcess.StartInfo.Arguments = s7ZipCmdArgs
    myProcess.StartInfo.WorkingDirectory = "C:test"
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.CreateNoWindow = True
    myProcess.Start()
    myProcess.WaitForExit()
End Sub

代码执行良好,除了重定向到文本文件:"> C:testzipresults.txt"在s7ZipCmdArgs字符串变量。我不知道为什么这不起作用,我试过不同的双引号和三引号,但都没有成功。它在使用相同字符串的批处理文件中工作。

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

对于第一部分,您是否尝试在命令参数中的>之前添加空格?您还可以查看这个答案,以便在代码中捕获输出。

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

Dim pgm = "C:Program Files7-Zip7z.exe"
Dim args = "l C:DevTest.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:Devtest.txt")
    AddHandler myProcess.OutputDataReceived,
        Sub(sender, e)
            out.WriteLine(e.Data)
        End Sub
    myProcess.Start()
    myProcess.BeginOutputReadLine()
    myProcess.WaitForExit()
End Using

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

最新更新