【问题标题】:Is it possible to process exit codes > 255 with perl?是否可以使用 perl 处理退出代码 > 255?
【发布时间】:2011-10-10 20:05:49
【问题描述】:

首先,找到关于退出代码in perl (also here)和on Windows的一点背景。

现在 - 当我执行另一个进程时从 perl 脚本(我对方法持开放态度,qx/open/system/exec/IPC::Run等)在 Windows 上

是否可以捕获0-255范围之外的退出代码?

在 Windows 上,一个进程可以返回一个完整的(签名的)32 位退出代码,并且返回 0x8...0... 的东西并不少见,即一些 COM 错误代码之类的。

【问题讨论】:

    标签: windows perl exit-code


    【解决方案1】:

    有可能,但并不简单。

    Win32::API 模块可以将 Windows API 公开给 Perl 脚本。使用它为the GetExitCodeProcess function 创建一个代码引用,使用死程序的进程标识符调用它,然后解包结果。

    【讨论】:

      【解决方案2】:

      是的,Win32::Process 可以返回完整的签名 32 位退出代码。使用GetExitCode 方法。但这有点棘手,因为返回值不是退出代码(它是WindowsGetExitCodeProcess函数的返回值,表示函数成功或失败)。退出代码存储在您传递给方法的变量中。

      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();
      

      【讨论】:

      • 很好的例子。谢谢! (现在唯一的问题显然是 Wait(INFINITE) 有点反应迟钝:-)
      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多