2011-02-25 117 views
2

我有一个perl文件,它调用批处理文件来安装第三方程序。捕获从Perl批处理文件返回的错误代码

Main.pl

system ("Installer.bat"); 
print "Error code is $? \n"; 

Installer.bat

@echo off 
installer.exe 
echo errorlevel is %errorlevel% > logfile 
exit %errorlevel% 

错误代码3010是通过批处理文件返回,它表明,需要重新启动。 但是,perl模块打印49664.我认为它应该打印3010.有人可以解释这是如何工作的?我想获取我的Perl代码中需要重新启动的错误代码,然后执行一些清理工作并从perl模块重新启动计算机。

以下相关问题也不清楚。 - Windows批处理文件只有255个错误代码,那么3010如何作为错误代码返回? - This place表明我们需要将错误代码右移8位以获取本地错误代码。所以如果我右移49664 8,我得到194(这仍然不像3010)。不过,我也注意到,3010国防部256 = 194

+0

你试过[$ {^ CHILD_ERROR_NATIVE}](http://perldoc.perl.org/perlvar .html)或[Win32 :: Process](http://search.cpan.org/~jdb/Win32-Process-0.14/Process.pm)? – Mikel 2011-02-25 10:56:28

+1

你对3010 mod 256的评论主要回答你自己的问题。你现在得到8位答案。因此,Oesor的回答可能是你需要做的,以获得全部价值。 – 2011-02-25 15:19:22

回答

3

http://search.cpan.org/perldoc?IPC::System::Simple

由于IPC ::系统::简单v0.06,当有多个参数调用运行子程序将提供完整的32位在Win32系统上退出值。这与以前版本的IPC :: System :: Simple以及Perl的内置系统()函数不同,后者只能处理8位返回值。

0

Exit codes批处理文件are broken,exit%errorlevel%将设置批处理文件的退出码,但不是进程!

@echo off 
set err=3010 
@%COMSPEC% /C exit %err% >nul 

这将过程(CMD.EXE可能)的退出代码设置为3010。