2009-10-20 46 views
4

我想讓下面的代碼工作,所以我可以從我的 c#程序調用一個perl腳本。我正在開發在xp service pack3上使用visual stdio 2008。perl.exe不能被ProcessStartInfo調用

myProcess = new Process(); 
     ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe"); 
     myProcessStartInfo.Arguments = @"C:\Documents and Settings\test_perl.pl"; 
     myProcessStartInfo.UseShellExecute = false; 
     myProcessStartInfo.RedirectStandardOutput = true; 
     myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     myProcessStartInfo.CreateNoWindow = true; 
     myProcess.StartInfo = myProcessStartInfo; 

     myProcess.Start(); 
     string output = myProcess.StandardOutput.ReadToEnd(); 
     MessageBox.Show(output); 
     myProcess.WaitForExit(); 

我驗證test_perl.pl是否存在,如果我將perl.exe更改爲notepad.exe,那麼上面的代碼工作。但是如果我使用perl.exe,消息框是空的。

不知道爲什麼這是錯的。如果你知道原因,請幫助我。

謝謝

回答

6

可以perl.exe處理在命令行中包含空格的未加引號的路徑嗎?嘗試引用的路徑:

myProcessStartInfo.Arguments = @"""C:\Documents and Settings\test_perl.pl"""; 

由於命令行參數用空格分隔,除非文件路徑被引用,應用程序(perl.exe所在,在這種情況下),會看到三個參數:

  1. C:\文件
  2. 設置\ test_perl.pl

Perl將有可能嘗試打開文件「C:\ doc文件uments」。當然這不存在。解決方案是引用包含空格的文件路徑(或所有文件路徑,以保持一致)。

您提到notepad.exe處理未加引號的文件路徑正常。可能,這只是記事本比一般的熊更聰明,並且將它的理由與你合併。

然後驗證文件是否存在該路徑。這實際上是一條不尋常的道路;通常情況下,您會看到類似於C:\ Documents and Settings \ myusername \ Documents \ file.ext等用戶文件。

+0

我不認爲文件路徑有任何問題,因爲如果我將perl.exe更改爲notepad.exe,它可以工作。 我也擺脫了myusername \ Documents \的目的。 – alex 2009-10-20 05:24:29

+0

...無論如何嘗試。記事本!= perl。 – 2009-10-20 05:26:58

+0

邁克爾,你很好!謝謝!它正在工作。但爲什麼額外的「」在那裏? – alex 2009-10-20 05:38:03

0

是否在您的%PATH%中有perl?打開命令提示符並鍵入「perl -v

+0

是的,我可以在dos窗口上執行perl xxx.pl或xxx.txt。 – alex 2009-10-20 05:10:52

+0

我很困惑,你把這個標記爲正確的,但它似乎仍然不適合你。我只是試過這個,它爲我工作。你確定perl程序打印任何東西嗎?你確定它打印出標準嗎?在控制檯程序而不是Windows應用程序中嘗試它。 perl程序的內容是什麼? – tster 2009-10-20 05:32:46