是否可以处理退出代码> 255 与 perl?

发布于 2024-11-25 13:37:28 字数 747 浏览 0 评论 0原文

首先,了解有关退出代码的一些背景 在 Perl 中 (也在这里)和在 Windows 上

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

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

在 Windows 上,进程可以返回完整(带符号)的 32 位退出代码,并且返回 0x8...0...< /code>,即一些 COM 错误代码或类似的代码。

First, find a little background about exit code in perl (also here)and on Windows.

Now - when I execute another process from a perl script (I'm open as to the method, qx/open/system/exec/IPC::Run, etc.) on Windows:

is it possible to capture exit codes outside the range of 0- 255?

On Windows, a process can return a full (signed) 32bit exit code, and it's not so uncommon to have something return 0x8...0..., that is, some COM error code or somesuch.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如梦 2024-12-02 13:37:28

是的,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();

Yes, Win32::Process can return the full signed 32-bit exit code. Use the GetExitCode method. But it's a little tricky, because the return value is not the exit code (it's the return value of the Windows GetExitCodeProcess function, which indicates success or failure of the function). The exit code gets stored into the variable you pass to the method.

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();
巷子口的你 2024-12-02 13:37:28

这是可能的,但并不简单。

Win32::API 模块可以公开 Windows Perl 脚本的 API。使用它为 GetExitCodeProcess 创建代码引用 函数,使用死程序的进程标识符调用它,并解压结果。

It's possible but it's not simple.

The Win32::API module can expose the Windows API to Perl scripts. Use it to create a code reference for the GetExitCodeProcess function, invoke it with the process identifier of the dead program, and unpack the result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文