Chapter 19

「バッチ ジョブを終了しますか (Y/N)?」

zetamatta
zetamatta
2020.12.27に更新

Ctrl-C を押下すると「バッチ ジョブを終了しますか (Y/N)?」というプロンプトが出ます。これ鬱陶しいですね。Ctrl-C を押下したのだから、問い合わせなしで終了してほしいところです。

ググってみたところ、対応方法はないこともないようです。

標準入力を NUL にリダイレクトしておく

バッチ ジョブを終了しますか (Y/N)?」というプロンプト表示そのものは抑制できないのですが、入力にすぐ EOF が飛ぶので、ただちに終了してくれるようです。

@echo off
if not "%1" == "-do" %~dpnx0 -do <nul
shift
ping /t 127.0.0.1

ユーザにいちいち <NUL と指定してもらうわけにはいかないので、バッチファイルで自らの標準入力を NUL にリダイレクトしたいところです。とはいえ、バッチファイルでは /bin/sh みたいに exec コマンドで自分の標準入出力を切り替えることはできないので、例では自分自身をオプション付きで呼び出し直すことで <NUL を実現しています。
(自分自身を呼び出しの際、call をつけていないので、呼び出したら戻って来ないことに注意)

ただし、この方法では標準入力を潰すので、当然ながらユーザからのデータ入力ができなくなってしまいます。一応、<CON でコンソールに標準入力を復活させてやることはできますが、端末の状態が完全に戻るわけではないのか、ssh とかのパスフレーズ入力がうまくいかなくなったり、Ctrl-C そのものが効かなくなったり挙動が微妙におかしくなってしまうようです。

@echo off
if not "%1" == "-do" %~dpnx0 -do <nul
shift
set /P "DATA=データ=" <CON
echo DATA=%DATA%
ping /t 127.0.0.1

start /b /i オプション → NG ?

start /? のヘルプで確認すると

    B           新しいウィンドウを作成せずにアプリケーションを起動します。
                アプリケーションは Ctrl + C を無視します。
                アプリケーションで Ctr l+ C を有効にしていない場合、
                Ctrl + Break がアプリケーションを中断する唯一の方法です。
    I           新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境に
                なります。

とあり、Ctrl-C が無視されるようになるので使えそうに見えます。

@echo off
if not "%1" == "-do" (
    start "" /b /I %~dpnx0 -do
    exit /b
)
shift
ping /t 127.0.0.1

ただ、これをやってみると Ctrl-C でバッチファイルは直ちに止まるけど、バッチファイル内の実行ファイルは止まらないので、下手をすると複数プロセス間での標準入力の奪い合いになって逆に面倒なことになってしまうようです。<NULの方がまだマシかな?