【发布时间】: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