Cmdでは、Ctrl + Cを押すとターゲットアプリケーションが終了しますが、ターゲットアプリケーションがバッチファイルから呼び出された場合は、「バッチジョブの終了(Y/N)」という確認メッセージが表示されます。バッチジョブを終了しないことを選択したインスタンスを思い出すことはできません。この確認をスキップする方法
この動作は仕様によるもので、コマンドインタプリタによって制御されるため、できません。インタプリタを逆コンパイルして直接再コンパイルしない限り、これを「マッピング」または「傍受」する方法はありません。
押す Ctrl+C 二度。
この サイト で、私は効果的な解決策を見つけました。
script2.cmd < nul
上記の行と同じフォルダーにscript.cmd
という2番目のスクリプトを作成するたびにこれを入力する必要はありません。私はXPでのみこのテクニックをテストしました、しかし、他のものは勝利7でそれを確認しました。
Nathan氏は、次のように付け加えています。もう1つの選択肢は、script.cmdの先頭に次のコードを追加することです。これは、1つのファイルで同じことを行います。
rem Bypass "Terminate Batch Job" Prompt.
if "%~1"=="-FIXED_CTRL_C" (
REM Remove the -FIXED_CTRL_C parameter
SHIFT
) ELSE (
REM Run the batch with <NUL and -FIXED_CTRL_C
CALL <NUL %0 -FIXED_CTRL_C %*
GOTO :EOF
)
インストール クリック して、 "terminate_autoanswer"設定を変更します。設定ファイル はここにあるべきです :C:\Users\<username>\AppData\Local\clink\settings
。
# name: Auto-answer terminate Prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1
これはそれからcmd.exeの窓と "ちょうど"働く。 cmd.exeをクリックバックするので、実行しているものを変更する必要はありません。
Frickin 'すごい、IMO!
アプリケーションが正常に終了した後にバッチファイルで何もする必要がない場合は、 start
コマンドを使用すると、バッチファイルはすでに終了していることが保証されます。 Ctrl-Cを押すまでにそのため、メッセージは表示されません。
例えば:
@echo off set my_command = ping.exe set my_params = -t www.google.co.jp echo実行するコマンド'start':%my_command%%my_params% ::/Bまたは/ WAITを使用していない場合は、これで新しいウィンドウが作成されます。 start%my_command%%my_params% echo。 echoこの行は、実行前に実行されます。 'start'は終了しています。そのため、この エコーバッチファイルは、もう一方のウィンドウでCtrl-Cを押す前に完了します。 echo。 ::テストのためだけに 'pause'を使用する「続けるには任意のキーを押してください」と表示し、 :: 'echo'コマンドの出力を確認します。必ず[ping]コマンドを実行するウィンドウ ::でCtrl-Cを押してください(このウィンドウではありません)。または混乱した場合は単に ::次の行を削除します: 一時停止
(Windows XPでテスト済み)
私はしばらくの間 "Terminate batch job"プロンプトを避けたいというこの欲求と戦いました。
私の最新のエピファニーは、cmd.exe
のインスタンスを別のインスタンスに置き換えることで、ちょっとした手のひらサイズ(またはコンソールウィンドウ)になります。これは、start cmd /k
ファイルで.BAT
に続けてexit
を指定して、コマンド/プログラムを実行することによって実行されます。
元のコンソールウィンドウは消え、交換用のウィンドウは次の方法できれいに停止できます。 Ctrl - C。
以下によって割り込まれる可能性があるtraceroute
の次の例を考えてください。 Ctrl+CユーザーをC:\>
プロンプトに戻します。
@echo off
set timeout=100
if not "%2"=="" set timeout=%2
start cmd /k tracert -w %timeout% %1
exit
新しいコマンドインタプリタの環境代用は誰にとってもそうではないかもしれません、しかし、肉眼で見て、そして私のためによく働きます。
Gringoの解決策は良いですが、SHIFT
はpython myscript.py %*
を更新しないので、引数リストを渡すスクリプト(すなわち%*
)ではうまくいきません。 回避策 がありますが、それらには一定の制限があります。
これが私が最後に行った修正です。
IF [%JUSTTERMINATE%] == [OKAY] (
SET JUSTTERMINATE=
python myscript.py %*
) ELSE (
SET JUSTTERMINATE=OKAY
CALL %0 %* <NUL
)
99.(9)%完璧。
このStack Overflowの質問 をご覧ください。
しかし、cmd.exeにパッチをあてることは私がそれのためにするものではありません。
スタートは動作しますが、バッチファイルによって開かれたウィンドウは私が持っていたオプションから変更され、 "プロパティ"は無効にされます(応答しません)。
私は、終了時に^ Cを親バッチにスローするように見えるEXEを使用してこれに遭遇し、クリーンな終了時でも「Terminate Batch Job」プロンプトを出しました。
私が使用することを選択した解決策は、他の答えと同じように「開始」でバッチを実行することでしたが、PowerShellプロンプトから(または、選択した場合はCMDのPowerShellインタープリターメソッドを介して)。
2018年になりました。Windows10では、Microsoftは優先コマンドのプロンプトとしてPowerShellを使用したCMDに取って代わるようになりました。そのため、デフォルトではGUIですぐに使用できます。
Start
は Start-Process のエイリアスです。
実行すると、起動して戻るだけです。そのため、起動したプロセスを停止したときに、「Terminate Batch Job」プロンプトは表示されません。
デフォルトでは待機しないので、コマンド以外に追加の引数や引数は必要ありません。
私のバッチでstart mything.exe -mythings -arguments
を使うことは完全にうまくいきました。
PowerShellでは、スクリプトを起動するパスを前に付ける必要があるので、私はバッチファイルを.\Host.bat
として実行します。
「バッチジョブの終了(Y/N)」を抑制する主な理由は、プログラムをループで実行することです(たとえば、クラッシュした場合に再実行すること)。
これ https://stackoverflow.com/a/8185270/1170023 は、この解決策につながった。
@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH
:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex
:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
goto RUN
) else (
rem echo Dedicated server is still running
timeout /t 5 >nul
goto LOOP
)
コマンドの末尾に<nulを追加して、バッチ標準入力をnullにリダイレクトするだけです。
私の場合、それは私のユーザーディレクトリ(VistaではC:\ Users \、XPではC:\ Documents and Settings \)にあったping.batファイルでした。
このバッチファイルは、現在のディレクトリが自分のユーザディレクトリであるコマンドプロンプトからpingを実行するたびに実行されました。 [実行]ウィンドウから、または他のユーザーのディレクトリからpingを実行しても問題ありませんでした。
私のユーザーdirからファイルを削除して問題は解決しました!
TCC/LE は無料のCMD置き換え(CMD ++と考えてください)で、バッチジョブの終了プロンプトを抑制するオプションがあります。このオプションは、 TCCスタートアップ設定ダイアログ にあります。
Ctrl + Cでバッチファイルをキャンセル:Ctrl + Cを押すと通常のプロンプトなしでバッチファイルの処理をキャンセルします。
スクリーンショット
あなたがTCC/LEについてこれまでに聞いたことがないのであれば、これはサイトからのいくつかの曖昧さです:
TCC/LEはCMDコマンドライン(デフォルトのWindowsコマンドプロンプト)に代わるものです。 TCC/LEは、CMDのスーパーセットで、111個の内部コマンド(CMDは40個未満)、240個の内部変数と機能、および既存のCMDコマンドに対する数百の拡張機能を備えています。
TCC/LEは、既存のコマンドラインアプリケーションとバッチファイルと連携しますが、コマンドラインとバッチファイルの機能を大幅に改善し、コマンドプロンプトウィンドウに何千もの新機能を追加します。
私は長年TCC/LEを使い、それ以前は4NTを使いました。私はそれが大好きですし、それをお勧めすることができます。私がまだそれを使用していない唯一の理由は、私が現在ほとんど排他的にPowerShellを使用しているからです。