如何在Perl中使用系统调用而不打印结果/输出文本?
我正在Windows XP上使用Cygwin Perl 我有这个代码将运行第三方程序如何在Perl中使用系统调用而不打印结果/输出文本?,perl,system,Perl,System,我正在Windows XP上使用Cygwin Perl 我有这个代码将运行第三方程序 sub main { print("Start Running\n"); @return = run_exe($execApp, $parm1, $parm2); my $returncode = pop @return; if ($returncode == 0) { print("Success\n"); } else { pr
sub main {
print("Start Running\n");
@return = run_exe($execApp, $parm1, $parm2);
my $returncode = pop @return;
if ($returncode == 0) {
print("Success\n");
}
else {
print("Error\n");
}
}
sub run_exe {
my ($exe, @parm) = @_;
my (@output, @return_output);
@output = system($exe, @parm);
foreach (@output) {
next if !/\S/; # white space line
s/^(\s*)//g; # trim from the front for $_
s/(\s*)$//g; # trim from the end for $_
push (@return_output, $_);
}
push (@return_output, $?>>8);
@output = ();
return (@return_output);
}
如果成功,将打印此文件:
Start Running
Return Code: 0
Success
我不想打印运行run_exe子例程的输出(即返回代码:0):
我怎样才能做到这一点?请帮帮我,我在谷歌上搜索过,但什么也没找到。你在你的程序中使用了
system
,它可以让你正在运行的程序打印到标准输出,并返回程序的退出状态(一个数字)
因此,您目前拥有的没有任何意义,因为@output
将只包含一个数字,并且您无法将其解析为正在运行的程序的输出
你可能需要的是回执
`$exe @parm`
或者,更清楚地说
qx{$exe @parm}
这将返回程序的输出,正如您所期望的那样,并避免将其打印到标准输出
请注意,您可能需要注意$exe
和@parm
的内容,因为生成的字符串必须在命令行中有效,并且字段可能需要适当地引用或转义
更新
再次查看您的代码,您可能希望看到系统的退出状态。但是把它放在一个数组中,在数组上循环,提取非空白元素是非常复杂的!结果与添加到返回数组中的$?
值相同
要转移程序的输出,您需要从命令shell而不是直接运行它,因此要将输出发送到Windows nul设备,您的代码如下所示
system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;
实际上,您也可以删除子例程并更改行
@return = run_exe($execApp,$parm1,$parm2);
my $returncode = pop @return;
到
您已经在程序中使用了system
,它可以让正在运行的程序打印到标准输出,并返回程序的退出状态(一个数字)
因此,您目前拥有的没有任何意义,因为@output
将只包含一个数字,并且您无法将其解析为正在运行的程序的输出
你可能需要的是回执
`$exe @parm`
或者,更清楚地说
qx{$exe @parm}
这将返回程序的输出,正如您所期望的那样,并避免将其打印到标准输出
请注意,您可能需要注意$exe
和@parm
的内容,因为生成的字符串必须在命令行中有效,并且字段可能需要适当地引用或转义
更新
再次查看您的代码,您可能希望看到系统的退出状态。但是把它放在一个数组中,在数组上循环,提取非空白元素是非常复杂的!结果与添加到返回数组中的$?
值相同
要转移程序的输出,您需要从命令shell而不是直接运行它,因此要将输出发送到Windows nul设备,您的代码如下所示
system('cmd /C', $exe, @parm, '>nul');
return $? >> 8;
实际上,您也可以删除子例程并更改行
@return = run_exe($execApp,$parm1,$parm2);
my $returncode = pop @return;
到
我今天遇到了同样的问题,我记得我在很多很多脑细胞之前(大约4年前的脑细胞价值)就找到了解决方案。在花了很长时间搜索我的旧代码后,我找到了解决方案。给你。只需将您的系统调用放在返回标记内,并附加“2>&1”。这里有一个例子
my$results=nslookup-type=ns stackoverflow.com 2>&1
系统调用的结果将分配给$results,而不会打印。我记不清确切的原因和方式,但确实如此
这对我来说很重要,因为我经常在PERL编辑器中运行脚本,如果我允许大量打印(即,如果上面的命令重复数千次),它将使用大量的系统内存,最终会使用所有的系统内存
我知道这是一个古老的话题,但希望它对下一个可怜的、不幸的、疯狂地用谷歌搜索问题解决方案的灵魂有价值,就像我今晚那样 我今天遇到了同样的问题,我记得我在很多很多脑细胞(大约4年前的脑细胞)之前找到了解决方案。在花了很长时间搜索我的旧代码后,我找到了解决方案。给你。只需将您的系统调用放在返回标记内,并附加“2>&1”。这里有一个例子
my$results=nslookup-type=ns stackoverflow.com 2>&1
系统调用的结果将分配给$results,而不会打印。我记不清确切的原因和方式,但确实如此
这对我来说很重要,因为我经常在PERL编辑器中运行脚本,如果我允许大量打印(即,如果上面的命令重复数千次),它将使用大量的系统内存,最终会使用所有的系统内存
我知道这是一个古老的话题,但希望它对下一个可怜的、不幸的、疯狂地用谷歌搜索问题解决方案的灵魂有价值,就像我今晚那样 我已经试过了,但是程序有一个错误。如果它是$exe或@parm,我真的不知道哪个是错的。我已经写了一个更新,它保留了单独的参数。那应该对你有用。如果要诊断qx
版本,请运行print“$exe@parm\n”
,以便查看正在生成的命令行。如果您仍然看不到错误,请将其发布到这里。顺便说一句,我忘了包括,我正在使用cygwin perl。这有关系吗?我有一个错误-无法执行“cmd/C”:没有这样的文件或目录。@quinekxi:这似乎很重要,但这意味着cmd.exe
不在路径上。如果在命令提示下键入cmd
,是否有效?你从哪个命令中得到了什么?该位置在命令提示符下的路径?cmd中有效。当我将你的代码与'>nul'一起使用时,它可以工作,但当我包含'>nul'时,$exe在返回代码中有一个错误:101。我有