【问题标题】:Capture 7-Zip output and exit code from a process in VB从 VB 中的进程中捕获 7-Zip 输出和退出代码
【发布时间】:2014-06-19 08:37:17
【问题描述】:

我有以下 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

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

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

【问题讨论】:

  • 我尝试过重定向">",两边和文件定义旁边都有空格,但没有成功。
  • myProcess.ExitCode 方法确实包含 7Zip 应用程序的退出代码。好电话。
  • 使用> 重定向似乎不适用于Process.Start - 我已经更新了我的答案。
  • 在用 7z 尝试过类似的任务后,我切换到 DotNetZip - 简单多了。
  • 我现在遇到的问题是 myProcess.WaitForExit() 执行控制台输出后永远不会返回。当我注释掉 RedirectStandardOutput = True 时,它​​工作正常。不知道我错过了什么。至于 .NET zip,我无法搜索所有文件类型并排除 Windows 和回收站。

标签: vb.net


【解决方案1】:

对于第一部分,您是否尝试在命令参数中的 > 之前添加一个空格?您还可以查看 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() 调用之后得到结果。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2015-05-08
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多