【问题标题】:Capturing error codes returned from a batch file in Perl捕获从 Perl 中的批处理文件返回的错误代码
【发布时间】:2011-02-26 00:15:11
【问题描述】:

我有一个 perl 文件,它调用一个批处理文件来安装第 3 方程序。

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 Mod 256 = 194

【问题讨论】:

  • 您对 3010 mod 256 的评论主要回答了您自己的问题。你现在得到了 8 位答案。因此,Oesor 的答案可能是您需要做的事情才能获得全部价值。

标签: perl batch-file


【解决方案1】:

http://search.cpan.org/perldoc?IPC::System::Simple:

从 IPC::System::Simple v0.06 开始,使用多个参数调用的 run 子例程将在 Win32 系统上提供完整的 32 位退出值。这与以前版本的 IPC::System::Simple 和 Perl 的 in-build system() 函数不同,后者只能处理 8 位返回值。

【讨论】:

    【解决方案2】:

    Exit codes 在批处理文件中are broken,exit %errorlevel% 将设置批处理文件的退出代码,而不是进程!

    @echo off
    set err=3010
    @%COMSPEC% /C exit %err% >nul
    

    这会将进程的退出代码(可能是cmd.exe)设置为3010。

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多