Perl как инструмент пакетного сценария - полностью конвейерный дочерние процессы? - PullRequest
2 голосов
/ 21 июля 2011

Извиняюсь, если какая-то терминология здесь не совсем понятна.Не стесняйтесь поправлять меня, если я что-то неправильно использую.

Можно ли использовать Perl в качестве "расширенной оболочки" для запуска "пакетных" скриптов?(в Windows)

Проблема, с которой я сталкиваюсь при замене скрипта .bat / .cmd, который слишком усложняется скриптом perl, заключается в том, что я не могу легко запускать подпроцессы, как это делает оболочка.

То есть я хотел бы сделать то же самое из моего сценария perl, что и оболочка, при вызове дочернего процесса, то есть полностью "соединить" STDIN, STDOUT и STDERR.

Пример:

foo.bat -

@echo off
echo Hello, this is a simple script.
set PARAM_X=really-simple

:: The next line will allow me to simply "use" the tool on the shell I have open, 
:: that is STDOUT + STDERR of the tool are displayed on my STDOUT + STDERR and if
:: I enter something on the keyboard it is sent to the tools STDIN

interactive_commandline_tool.exe %PARAM_X%

echo The tool returned %ERROLEVEL%

Однако я понятия не имею, как полностью реализовать это в perl (возможно ли это вообще?):

foo.pl -

print "Hello, this is a not so simple script.\n";
my $param_x = get_more_complicated_parameter();

# Magic: This sub executes the process and hooks up my STDIN/OUT/ERR and 
# returns the process error code when done
my $errlvl = run_executable("interactive_commandline_tool.exe", $param_x);
print "The tool returned $errlvl\n";

Как мне добиться этого в Perl?Я играл с IPC :: Open3 , но, похоже, это не сработало ...

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Возможно, вы найдете IPC::Run3 полезным. Это позволяет вам захватывать как STDOUT, так и STDERR (но не передавать их в реальном времени). Уровень ошибки команды будет возвращен в $?.

1 голос
/ 21 июля 2011

Почему бы не так:

print "Hello, this is a not so simple script.\n";
my $param_x = get_more_complicated_parameter();

system('cmd.exe', $param_x);
my $errorlevel = $? >> 8;
print "The tool returned $errorlevel\n";

sub get_more_complicated_parameter { 42 }

У меня нет вашей интерактивной программы, но выполненная оболочка позволила мне вводить команды, она унаследовала среду, определенную в perl и т. Д.

Я использую perl в качестве замены для более сложных сценариев оболочки в Windows долгое время, и пока все, что мне было нужно, было возможно.

...