运行Perl通过C#代码

问题描述:

我想通过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

它看起来好像缺少字符串连接中两个文件参数之间的空格。

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