2010-02-11 60 views
1

我正在使用第三方軟件工具(命令行工具)將PDF文件合併在一起。使用C#我試圖使用System.Diagnostics.Process來運行可執行文件,但是我根據參數設置提出了一些錯誤。System.Diagnostics.Process問題與工作目錄

  • 如果UseShellExecute =真實RedirectStandardOutput =真我得到:
    • Process對象必須具有UseShellExecute屬性設置爲False,以重定向IO流。
  • 如果UseShellExecute =真,RedirectStandardOutput =假,我得到:
    • 該系統找不到指定的文件
  • 如果useShellExecute =虛假和RedirectStandardOutput =真我得到:
    • 系統找不到指定的文件
  • 如果UseShellExecute =虛假和RedirectStandardOutput =假,我得到:
    • 該系統找不到指定的文件

運行的代碼如下:

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(); 

有人可以幫我解決這個問題,請

回答

2

參數不應該在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"); 
} 
+0

這個建議與Kevin Gales合併「@」建議效果很好。謝謝你們的幫助。 – mattgcon 2010-02-11 19:18:46

6

當UseShellE xecute爲false,WorkingDirectory屬性更改其含義!它成爲新進程的工作目錄而不是可執行文件的路徑。您需要改爲在FileName屬性中指定可執行文件的完整路徑。

+0

遠遠看見我最初想你的建議,但當時我recieving了「系統無法找到指定的文件「錯誤。 這就是我原來的: p.StartInfo.FileName =「C:\\ Program Files(x86)\\ VeryPDF PDF Split-Merge v3.0 \\ pdfpg.exe」+ strFileNames。Trim()+「」+ D2P_Folder_Converted +「\\」+ strOutputFileName; – mattgcon 2010-02-11 19:08:19

+0

請參閱Kevin的評論 - 您需要將參數放置在Arguments屬性中的可執行文件中。 UseShellExecute問題的參考在這裏:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx – 2010-02-11 22:28:55

+0

謝謝詹姆斯,我在這方面掙扎.....多麼愚蠢他們在UseShellExecute被禁用時更改WorkingDirectory的含義! – Dal 2010-08-04 12:22:31

0

我不是專家,使用進程API,但它看起來像你將命令行參數放入FileName。嘗試使用參數作爲命令行參數。並把完整路徑的exe文件名。

同時在字符串前使用@可以消除反斜槓加倍的需要。

p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe"