我是 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
错误的返回值,请纠正我。