2012-02-13 78 views
1

我想通過C#代碼運行perl腳本。 perl腳本將一個文本文件作爲輸入,並創建兩個新文件作爲輸出(在兩者之間進行一些文本處理)。當我使用下面的代碼通過C#運行perl腳本時,它似乎開始執行,但沒有創建文件。有什麼問題?語法錯誤?運行Perl通過C#代碼

 ProcessStartInfo perlStartInfo = new ProcessStartInfo(@"c:\Perl\bin\perl.exe"); 
     perlStartInfo.Arguments = "c:\\Perl\\DOC-MAT.pl " + "c:\\Perl\\comb1.txt" + "c:\\Perl\\comb1.mat"; 
     perlStartInfo.UseShellExecute = false; 
     perlStartInfo.RedirectStandardOutput = true; 
     perlStartInfo.RedirectStandardError = true; 
     perlStartInfo.CreateNoWindow = false; 

     Process perl = new Process(); 
     perl.StartInfo = perlStartInfo; 
     perl.Start(); 
     perl.WaitForExit(); 
     string output = perl.StandardOutput.ReadToEnd(); 

這裏,comb1.txt是我的輸入文件,並comb1.mat和comb1.clabel應當由Perl代碼越來越創建的文件。

+0

1)該程序是否具有'C:\ Perl'的寫權限? 2)是否有可能將文件寫入標準輸出並因此寫入「字符串輸出」? – 2012-02-13 09:49:38

回答

2

它看起來好像缺少字符串連接中兩個文件參數之間的空格。

perlStartInfo.Arguments = "c:\\Perl\\DOC-MAT.pl " + "c:\\Perl\\comb1.txt" + "c:\\Perl\\comb1.mat"; 

應該是:

perlStartInfo.Arguments = "c:\\Perl\\DOC-MAT.pl " + "c:\\Perl\\comb1.txt " + "c:\\Perl\\comb1.mat"; 

也許是更好的選擇是建立參數字符串數組或列表,並使用string.Join做串聯。

var args = new List<string>(); 
args.Add(@"c:\file1"); 
args.Add(@"c:\file2"); 

psi.Arguments = string.Join(" ", args); 

以上將在.NET4工作,以前的版本可能會要求您將它傳遞給join方法之前調用args.ToArray()

重要編輯:此外,我認爲你需要交換最後兩行,以防止進程無限期地等待輸出緩衝區清除。有關更多詳細信息,請參閱Process.StandardOutput (MSDN)

+0

感謝您的幫助! – Cyang 2012-02-13 09:56:49

+1

我爲Aiur做! – 2012-02-13 10:30:54