【问题标题】:Running Perl throughC# code通过 C# 代码运行 Perl
【发布时间】:2012-02-13 09:23:19
【问题描述】:

我正在尝试通过 C# 代码运行 perl 脚本。 perl 脚本将一个文本文件作为输入并创建两个新文件作为输出(在两者之间进行一些文本处理)。当我使用以下代码通过 C# 运行 perl 脚本时,它似乎开始执行,但没有创建文件。有什么问题?语法错误?

        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 代码创建的文件。

【问题讨论】:

  • 1) 程序是否对C:\Perl 有写权限? 2)文件是否有可能被写入标准输出,从而写入string output

标签: c# perl


【解决方案1】:

您的字符串连接中的两个文件参数之间似乎缺少一个空格。

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 中可以使用,之前的版本可能需要您调用 args.ToArray() 才能将其传递给 join 方法。

重要编辑:另外,我认为您需要交换最后两行以防止进程无限期地等待输出缓冲区清除。详情请见Process.StandardOutput (MSDN)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2012-10-23
    • 2011-05-15
    • 2013-08-02
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多