私は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;
}
出力:
....。 ....。 dirを開くことができません: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
の戻り値を誤って解釈している場合は、訂正してください。