我使用一个第三方软件工具(指令行工具)合并的PDF文件。使用C#我试图使用 System.Diagnostics.Process 运行可执行的,但我带来了一些错误取决于参数的设置。

  • 如果 UseShellExecute = trueRedirectStandardOutput = true 我得到:
    • 该进程的对象必须拥有的 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();

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

有帮助吗?

解决方案

辩论不应该被通过 文件名 财产。你应该使用 参数 属于这样的:

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");
}

其他提示

UseShellExecutefalseWorkingDirectory 财产改变其含义!

它成为工作目录的新的过程 路径可执行的。你需要以全路径指定的可执行在 FileName 财产代替。

我不是专家使用的过程API但它看起来像您下命令行参数的文件。尝试使用的论据为该命令行参数。并把完整的路径exe在文件名称。

还使用一个@前的串摆脱需要增加一倍的反斜杠。

p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe" 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top