首先,找一些关于退出代码in perl(also here)和on Windows的背景信息。
现在 - 当我从perl脚本执行另一个进程时(我对该方法持开放态度qx
/ open
/ system
/ { {1}} / exec
等)Windows上的 :
是否可以捕获IPC::Run
- 0
范围之外的退出代码?
在Windows上,一个进程可以返回一个完整的(已签名的)32位退出代码,并且返回255
,即某些COM错误代码或某些内容并不常见。
答案 0 :(得分:6)
是的,Win32::Process可以返回完整签名的32位退出代码。使用GetExitCode
方法。但它有点棘手,因为返回值不退出代码(它是Windows GetExitCodeProcess函数的返回值,表示函数的成功或失败)。退出代码存储在传递给方法的变量中。
use Win32::Process;
use Win32;
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
my $ProcessObj;
Win32::Process::Create($ProcessObj,
"C:\\winnt\\system32\\notepad.exe",
"notepad temp.txt",
0,
NORMAL_PRIORITY_CLASS,
".") or die ErrorReport();
$ProcessObj->Wait(INFINITE);
my $exitCode;
$ProcessObj->GetExitCode($exitCode) or die ErrorReport();
答案 1 :(得分:4)
这是可能的,但并不简单。
Win32::API
模块可以将Windows API公开给Perl脚本。使用它为the GetExitCodeProcess
function创建代码引用,使用dead程序的进程标识符调用它,并解压缩结果。