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;
}

出力:

....。  
....。  
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の戻り値を誤って解釈している場合は、訂正してください。

4

1 に答える 1

8
于 2012-05-04T22:50:21.053 に答える