CMD の EXIT コマンドについて

いまだに、当日記の通算アクセス数トップ&毎月のアクセス数トップは常に id:ladybug:20090530 なぐらい、コマンドプロンプトさんは人気みたいですね。Power Shell にはもうちょっと頑張って欲しいところです。

CMD には EXIT というコマンドがありますが、こいつの機能をきちんと理解されていることは意外に少ないようです。ヘルプにも書いてあるんですが、

  • システム変数*1 ERRORLEVEL を指定した値に設定する (引数に数値を指定)
  • 現在のインタプリタの処理スコープを1つ終了する (引数に /B を指定)
  • 現在のインタプリタを処理スコープをすべて終了する (引数に /B を指定しない)

の3つの機能があります。/B は break の B かな?と思いますが、ループ処理と break, exit のあるC言語などで考えると雰囲気が伝わりますね。

int errlevel = 0;

void proc()
{
    while (true)
    {
        // インタプリタの処理

        if (... EXIT コマンド...)
        {
            if (...ExitCode 指定あり...)
            {
                // システム変数 ERRORLEVEL を設定
                errlevel = ...;
            }

            if (..."/B" 指定あり...)
            {
                // "/B" を指定されたら break
                break;
            }
            else
            {
                // "/B" が指定されなかったら exit
                exit(errlevel);
            }
        }

        if (...CALL コマンドやバッチ処理...)
        {
            proc();
        }
    }
}

void main()
{
    proc();

    // インタプリタは最後の ERRORLEVEL で終了する
    exit(errlevel);
}

環境変数の管理やら入出力の管理があるので、実際はもっと色々あるでしょうけど、EXIT コマンドのイメージとしてはこんなかんじですね。CMD.exe が終了するとき、ERRORLEVEL の最終値が CMD.exe の終了コードとして採用されます。

*1:環境変数とは違います。同名の環境変数を作るとややこしいことになるので注意しましょう。