3

我正在使用第三方软件工具(命令行工具)将 PDF 文件合并在一起。我尝试使用 C#System.Diagnostics.Process来运行可执行文件,但根据参数设置,我遇到了一些错误。

  • 如果我得到 UseShellExecute = trueRedirectStandardOutput = true
    • Process 对象必须将UseShellExecute属性设置为false才能重定向 IO 流。
  • 如果我得到 UseShellExecute = trueRedirectStandardOutput = false
    • 该系统找不到指定的文件
  • 如果我得到 useShellExecute = falseRedirectStandardOutput = true
    • 该系统找不到指定的文件
  • 如果我得到 UseShellExecute = falseRedirectStandardOutput = 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();

有人可以帮我解决这个问题吗?

4

3 回答 3

8

属性何时改变UseShellExecute其含义!falseWorkingDirectory

它成为新进程的工作目录,而不是可执行文件的路径。您需要在FileName属性中指定可执行文件的完整路径。

于 2010-02-11T19:05:25.280 回答
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");
}
于 2010-02-11T19:07:24.373 回答
0

我不是使用流程 API 的专家,但看起来您正在将命令行参数放入 FileName。尝试使用 Arguments 作为命令行参数。并将 exe 的完整路径放在 FileName 中。

在字符串前面使用 @ 也可以消除加倍反斜杠的需要。

p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe" 
于 2010-02-11T19:06:32.310 回答