我正在使用第三方软件工具(命令行工具)将PDF文件合并在一起。使用C#我试图使用System.Diagnostics.Process
来运行可执行文件但是我想出了一些错误,具体取决于参数设置。
UseShellExecute = true
和RedirectStandardOutput = true
:
UseShellExecute
属性设置为false
才能重定向IO流。UseShellExecute = true
和RedirectStandardOutput = false
:
useShellExecute = false
和RedirectStandardOutput = true
:
UseShellExecute = false
和RedirectStandardOutput = false
:
正在运行的代码如下:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\VeryPDF PDF Split-Merge v3.0";
p.StartInfo.FileName = "pdfpg.exe " + strFileNames.Trim() + " "
+ D2P_Folder_Converted + "\\" + strOutputFileName;
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();
有人可以帮我解决这个问题吗?
答案 0 :(得分:8)
当UseShellExecute
为false
时,WorkingDirectory
属性会改变其含义!
它成为新进程的工作目录 NOT 可执行文件的路径。您需要在FileName
属性中指定可执行文件的完整路径。
答案 1 :(得分:3)
不应在FileName属性中传递参数。您应该使用Arguments属性:
p.StartInfo.Arguments = string.Format(
"{0} {1}",
strFileNames.Trim(),
Path.Combine(D2P_Folder_Converted, strOutputFileName)
);
p.StartInfo.WorkingDirectory = Path.Combine(GetProgramFilesX86(), "VeryPDF PDF Split-Merge v3.0");
p.StartInfo.FileName = "pdfpg.exe";
其中GetProgramFilesX86
函数可以这样定义:
static string GetProgramFilesX86()
{
var processorArchitecture = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
if(IntPtr.Size == sizeof(long) || !string.IsNullOrEmpty(processorArchitecture))
{
return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
}
return Environment.GetEnvironmentVariable("ProgramFiles");
}
答案 2 :(得分:0)
我不是使用进程API的专家,但看起来您将命令行参数放入FileName。尝试使用Arguments作为命令行参数。并将完整路径放在FileName中的exe。
在字符串前面使用@也不需要加倍反斜杠。
p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe"