Perl作为批处理脚本工具 - 完全管道子进程?

时间:2011-07-21 16:23:53

标签: perl shell batch-file pipe

道歉,如果这里的某些术语可能很简单。如果我使用错误的术语,请随意纠正我。

是否可以将Perl用作运行“批处理”脚本的“高级shell”? (在Windows上)

替换使用perl脚本过于复杂的.bat / .cmd脚本时遇到的问题是我无法像shell那样轻松运行子进程。

也就是说,我想在我的perl脚本中做同样的事情,就像shell在调用子进程时那样,即完全“连接”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 个答案:

答案 0 :(得分:2)

你可能会发现IPC::Run3很有用。它允许您捕获STDOUT和STDERR(但不能实时管道它们)。命令错误级别将在$?中返回。

答案 1 :(得分:1)

为什么不这样:

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 }

我没有你的交互式程序,但执行的shell允许我输入命令,它继承了perl中定义的环境等。

我使用perl作为Windows上更复杂的shell脚本的替代品已经很长时间了,到目前为止我所需要的一切都是可能的。