我有以下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(用户错误)。我不知道如何捕获整数,以便我可以解码它。
答案 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()
调用后生成结果。