Запуск Perl через C # код - PullRequest
       6

Запуск Perl через C # код

1 голос
/ 13 февраля 2012

Я пытаюсь запустить 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.

1 Ответ

2 голосов
/ 13 февраля 2012

Похоже, что вы пропускаете пробел между двумя аргументами файла в конкатенации строк.

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) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...