2011-02-25 118 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。