道歉,如果这里的某些术语可能很简单。如果我使用错误的术语,请随意纠正我。
是否可以将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一起玩了,但似乎这没有办法......
答案 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脚本的替代品已经很长时间了,到目前为止我所需要的一切都是可能的。