首先,在 perl(也在这里)和Windows中找到一些关于退出代码的背景知识。
现在 - 当我在 Windows 上从 perl 脚本执行另一个进程时(我对方法qx
/ open
/ system
/ exec
/IPC::Run
等持开放态度):
是否可以捕获0
-范围之外的退出代码255
?
在 Windows 上,一个进程可以返回一个完整的(签名的)32 位退出代码,并且返回一些东西并不少见0x8...0...
,即一些 COM 错误代码或类似的东西。
是的,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();
这是可能的,但并不简单。
该Win32::API
模块可以将 Windows API 公开给 Perl 脚本。使用它为GetExitCodeProcess
函数创建代码引用,使用死程序的进程标识符调用它,然后解包结果。