5

我是 Perl 的初学者。我有一个包含多个 NMake 命令的 Windows 批处理脚本。此批处理脚本的一个现有问题是,即使 NMake 命令在执行期间失败,ERRORLEVEL也没有正确设置。

因此,在我们解析日志文件之前,我们永远不知道该命令是否有效。我调查了它,但找不到解决方案。我,然后考虑将此批处理脚本转换为 Perl 脚本,假设捕获错误会更容易,但似乎并不那么容易:)

每当我运行我的 Perl 脚本时,'system' 命令总是返回 0。我查看了许多不同的链接,并意识到捕获 'system' 命令的正确返回状态并不是那么简单。不过,我尝试了这些建议,但事情没有奏效。:(

让我提一下,被调用的 NMake 命令在执行过程中又调用了许多不同的命令。例如,下面提到的抛出“致命错误”的命令输出实际上是 Perl 脚本 (check_dir.pl) 的一部分。这个对 Perl 脚本的调用是写在 NMake 文件本身中的。

如果我直接调用这个 Perl 文件 ( check_dir.pl)并检查退出值,我会得到正确的结果,即命令失败并打印一个非零退出值(...意外返回退出值 2)。

尝试了 Perl 的系统功能,但没有帮助。我使用了以下代码:

system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1");

if ( $? == -1 ) {
    print "Command failed to execute: $!\n";
}
elsif ( $? & 127 ) {
    printf "The child died with signal %d, %s a coredump\n",
    ( $? & 127 ), ( $? & 128 ) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}

输出:

......  
......  
无法打开目录:R:\TSM_Latest  
压缩... NMAKE:致命错误 U1077:'if':返回代码 '0x2'  
停止。  
孩子以值 0 退出

也试过:

use IPC::System::Simple qw(system);  
my $exit_status = system ("nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1");

if ($exit_status != 0) {  
    print "Failure";  
    exit 3;  
} else {  
    print "Success";  
}

最后尝试了以下模块:

use IPC::Run qw( run timeout );  
run "nmake /f _nt.mak pack_cd SUB_PLAT=$PLAT DR=$plat 2>&1" or die "NMake returned $?";

似乎没有任何工作:(

如果我解释system错误的返回值,请纠正我。

4

1 回答 1

8
于 2012-05-04T22:50:21.053 回答