Проблема захвата вывода скрипта Perl с использованием C # - PullRequest
0 голосов
/ 02 декабря 2009

Я следил за одним из потоков для запуска сценариев perl из моей программы на c #.

Мой код C # выглядит так:

   private void RunScript(ArrayList selectedScriptFileList)
    {
        foreach (var curScriptFileName in selectedScriptFileList)
        {
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe");
            myProcessStartInfo.Arguments = (string)(curScriptFileName);
            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            myProcessStartInfo.CreateNoWindow = true;
            myProcess.StartInfo = myProcessStartInfo;


            myProcess.Start();
            myProcess.WaitForExit();
            string output = myProcess.StandardOutput.ReadToEnd();
            this.ScriptTestResultTextBox.AppendText(output);
        }            
    }

И мой Perl-скрипт требует парсинга XML. Я могу прочитать инструкцию print до синтаксического анализа XML, но не после начала синтаксического анализа. Скрипт выполняет поиск в DoS-оболочке.

Вот часть моего сценария:

print("\n");
print("****************** test1.pl ***********************\n");
print("\n");

print("1");
print("2");

my $scriptName = 'test1.pl';
my $file = '../../ScriptParamLib.xml';
my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($file);
my $root = $tree->getDocumentElement;
my @species = $root->getElementsByTagName('test_node');

print("Accessing XML Data Base...\n");

Тестовый блок c # показывает только первые три оператора печати, но не последний. Кто-нибудь знает почему?

Спасибо

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

Вы можете добавить больше отладочных операторов печати (например, один между каждой строкой вашего кода), чтобы увидеть, как далеко заходит выполнение. Однако я собираюсь предположить, что добавление этих трех строк в ваш сценарий либо решит проблему напрямую, либо приблизит вас к решению:

use strict;
use warnings;
use XML::LibXML;

Пожалуйста, обновите ваш вопрос, указав, насколько далеко зашло выполнение и какие ошибки вы видите!

0 голосов
/ 03 декабря 2009

Я решил, что я должен свернуть свои комментарии в ответ, так как они оказались полезными:

Поскольку использование абсолютного пути для $file в сценарии Perl работает, проблема, скорее всего, связана с рабочим каталогом процесса, который порождается программой C #. Вы можете использовать модуль Cwd в скрипте Perl, чтобы увидеть, что на самом деле является рабочим каталогом. Если это не то, что вы ожидаете, попробуйте установить его через свойство WorkingDirectory ProcessStartInfo в вашей программе на C #. Относительные пути должны нормально работать после этого.

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