18

EXIT /B Xコマンドを使用して一連の .bat ファイルを連鎖させ、成功または失敗を返し、次の .bat&&||条件付きで実行しようとしています(例: a.bat && b.bat)。

EXIT /B 0a.bat を終了するために呼び出すかどうかに関係なく、後で b.bata.bat && b.batを呼び出します。私の理解では、EXIT /B 0を設定する必要があります。ERRORLEVEL=0これは成功であり、&&続行する必要があります。これとは対照的に、呼び出しはどちらが失敗したEXIT /B 1かを設定する必要があるため、呼び出しは停止する必要があります。ここで何が欠けていますか?ERRORLEVEL=1&&

簡単な例:

非バッチ コマンドの場合、期待どおりに動作します。

C:\> echo test|findstr test>NUL && echo yes
yes

C:\> echo test|findstr test>NUL || echo yes

C:\> echo test|findstr nope>NUL && echo yes

C:\> echo test|findstr nope>NUL || echo yes
yes

を使用するEXIT /Bと、常に a.bat が成功したと見なされます。

C:\> echo @EXIT /B 0 > a.bat

C:\> a.bat && echo yes
yes

C:\> a.bat || echo yes

C:\> echo @EXIT /B 1 > a.bat

C:\> a.bat && echo yes
yes

C:\> a.bat || echo yes

a.bat を終了して期待どおりa.bat && b.bata.bat || b.bat動作させるにはどうすればよいですか?

すべてのコマンドは、Windows XP SP3 の cmd.exe で実行されます。

4

4 に答える 4

14

あなたが私に尋ねると、バッチファイルの終了コードはまさにこの理由で壊れていますが、使用できるハックな回避策があります. バッチ ファイルの最後の行として、次を使用します。

@%COMSPEC% /C exit 1 >nul

これは開始される実際のプロセスであるため、実際のプロセスの終了コードと && および || を取得します。動作します。

于 2011-01-08T22:16:27.190 に答える
12

callを使用して、exit ステートメントを含むバッチ スクリプトを実行すると、正常に動作します。

C:\>echo @EXIT /B 1 > a.bat

C:\>call a.bat && echo yes

C:\>call a.bat || echo yes
yes

ちなみに、Microsoft docsでは間違って言っています:

Call は、スクリプトまたはバッチ ファイルの外部で使用された場合、コマンド プロンプトでは効果がありません。

于 2011-01-08T14:06:44.333 に答える
0

start /wait使用する場合は、次のように DOS バッチ ファイルによって呼び出される非常に単純な Windows アプリケーション (C# で記述) でこれを使用することもできます。

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Environment.ExitCode = Convert.ToInt32(args[0]);
    }
}

次に、アプリケーションを DOS バッチ ファイルから呼び出して、結果を評価できます。すなわち

c:> start /wait SetRC 1
c:> if "%errorlevel%"=="1" goto abort

注: は/waitバッチ ファイルでは必要ありません。

必要な戻りコードを引数として program.cs に渡し、この方法で確実に取得することができます。

于 2013-11-13T20:49:28.843 に答える