213

In cmd, when we press Ctrl+C we get the target application terminated but if the target application is called from a batch file, we get this "Terminate batch job (Y/N)" confirmation. I can never remember an instance where I chose not to terminate the batch job. How can we skip this confirmation?

Srikanth
  • 4,799
  • 7
  • 31
  • 27
  • 37
    "I can never remember an instance where I chose not to terminate the batch job." And actually, in most cases, the job is terminated even if you answer No... – PhiLho Mar 25 '15 at 09:03
  • @PhiLho - That can't be true, as my scripts always continue after I enter `N`. I'm curious what scenario you have where the batch script terminates after you enter `N`. – dbenham Jul 20 '15 at 13:31
  • I was hoping this would be easy, but as usual Microsoft has made something simple a pain in the ass. The answers below are all expending way too much effort to avoid this minor annoyance. I'm just annoyed that there's no simple way to resolve this. Seriously Microsoft, what is the point of this prompt? Yes I'm sure, that's why I hit Ctrl + C... – CatDadCode Sep 14 '15 at 19:43
  • This problem is at least causing me to remember and make use of the `-n` switch for cygwin **ping** more often. – palswim Nov 25 '15 at 00:56
  • I don't have the reputation to post an answer, but I found the following worked for me on Windows 7 when running an external Java application (although it clears the command-window history for some reason): `@CMD /K "java -jar "%~dpn0.jar" %*" & EXIT 0` – Jeff G Apr 04 '17 at 00:26
  • 2
    I sent Microsoft feedback using feedback hub asking them to add an option to cmd.exe to turn this off: https://aka.ms/AAaxwcy – if enough people vote for it, maybe just maybe Microsoft might do something about it :) – Simon Kissane Jan 27 '21 at 06:38
  • @SimonKissane, I've tried to access your feedback and got denied access to it. Here is mine, FWIW: https://aka.ms/AAcyz0u – noseratio Jun 21 '21 at 06:13
  • @noseratio, I've tried to access your feedback and got denied access to it. – a3y3 Jul 02 '21 at 19:45
  • 1
    @a3y3, wow seems like Windows Feeback Hub access control logic is broken, which makes it pretty useless if we can't vote. – noseratio Jul 02 '21 at 22:28

16 Answers16

81

At this site, I found an effective solution:

script2.cmd < nul

To not have to type this out every time I made a second script called script.cmd in the same folder with the line above. I've tested this technique on XP only, but others have confirmed it on Win 7.

Nathan adds: another option is to put the following code at the top of script.cmd which does the same thing in one file:

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
)
Gringo Suave
  • 1,309
  • 11
  • 10
  • 3
    If you call a batch file from within itself (without using the CALL command), execution is "permanently" transferred. If STDIN is redirected to NUL, any "Terminate Batch Job" prompt will still appear, but won't wait (because STDIN is gone) for input. This works for me ... – William Feb 22 '13 at 07:54
  • 4
    This works in Windows 7. – William Feb 22 '13 at 07:54
  • 24
    It works, unless you need user input in the batch. – augustomen Mar 27 '13 at 14:51
  • 2
    @William, Just calling the script didn't work for me, but I came up with a workaround: `@IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])`. Calls itself recursively, but with an argument the second time. If your script has arguments, you could potentially use the first unused positional argument. That could be problematic if your script has a lot of arguments. My script didn't need arguments or user input. – jpmc26 Jul 19 '13 at 23:58
  • jpmc's answer worked for me. It does echo the darn Terminate (y/n)? message at then end though, but doesn't stop for it. – ggb667 Jan 24 '14 at 19:02
  • See my [answer](http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation/715798#715798), if your script relies on `%*`. – Alec Mev Feb 12 '14 at 11:36
  • perfect, should be accepted! – Totty.js Jul 08 '14 at 19:18
  • I think: `start /b /wait cmd /c ` works better – Sebastian Godelet Jul 15 '14 at 19:52
  • Another problem with this answer is that it won't work if your script wants to read actual input from stdin. – jamesdlin Jul 29 '17 at 00:11
  • 1
    You, sir, are a gentleman and a scholar – Tatiana Racheva Feb 05 '21 at 21:05
  • This should be the answer: `script2.cmd < nul` – Aaron Reed Dec 30 '22 at 21:06
76

AFAIK you can't as this behavior is by design and controlled by the command interpreter. There is no method of "mapping" or even "intercepting" this unless you de-compile and recompile the interpreter directly.

BinaryMisfit
  • 20,643
  • 10
  • 67
  • 76
  • 94
    That's disappointing :( – Srikanth Sep 04 '09 at 12:42
  • Yes it is disappointing. What’s even more disappointing is that the BREAK command, which by default does nothing under XP, could have been used to toggle the prompt… – Synetech Dec 24 '09 at 19:12
  • 6
    Though it might be true one cannot make the interpreter behave differently, using `start` like sgmoore suggested at http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation/35741#35741 seems a perfectly fine workaround to me. – Arjan Jan 06 '10 at 16:44
  • 1
    Here it is: http://superuser.com/a/498798/56101 – Totty.js Jul 08 '14 at 19:19
  • Vote here: https://www.reddit.com/r/Windows10/comments/q5j99w/please_make_ctrlc_to_actually_stop_a_batch_file/ – noseratio Oct 11 '21 at 01:07
  • @Srikanth This should not be the accepted answer, given a perfectly working answer exists by incapacitating standard input with `< NUL`. See at least two other answers here (linked in comments above). – 0xC0000022L Jun 27 '23 at 09:14
  • @0xC0000022L I've not revisited this answer in more than a decade since asking. Unfortunately, I don't have a Windows machine to try the `< nul` answer and confirm it. Also, the comments on those answers mention the downsides of that answer as well. I think given that those are imperfect workarounds, and that Microsoft still doesn't have a solution to this, I think is still the valid answer? – Srikanth Jun 27 '23 at 19:15
  • @Srikanth Understood. The only downside is that by making stdin a pipe, you effectively can't get prompts. The only command that I have found fails ungracefully is `timeout`. `pause` and other built-in commands return directly. The statement "this works, unless you need user input in a batch job" rings true here. But there is a solution and it works. Also, technically I wonder if it qualifies as a batch job if it needs user input aside from command line options and environment variables. But YMMV. – 0xC0000022L Jun 28 '23 at 11:20
73

Press Ctrl+C twice.

Kirill V. Lyadvinsky
  • 5,256
  • 5
  • 31
  • 32
  • 22
    This won't work but rather repeats the prompt. – Joey Sep 17 '09 at 05:25
  • Are you sure? I just tried it in an XP command prompt and it worked. I’ll check in DOS 7.11 later, but I’m pretty sure that Enter causes it to repeat the prompt, rather than Ctrl-C. – Synetech Dec 24 '09 at 19:10
  • I tried it in PS 2.0 on Win7 and it worked. However I have seen the repeating prompt too in the same env. It's a mystery. Still, +1. – jcollum Nov 22 '11 at 19:06
  • 17
    I just killed my database by doing that! The script was waiting on "pause", so I did CTRL-C, and then the prompt came, so I did CTRL-C again, and then the batch file hapilly carried on, and deleted my database! @see http://superuser.com/questions/740004/why-does-ctrl-c-on-terminate-batch-job-prompt-means-carry-on – Sebastien Diot Apr 10 '14 at 11:48
  • 6
    That's not what the OP asked. He could just as easily type "N" after ^C. – vladr May 12 '15 at 17:35
  • 4
    @vladr it's infinitely easier to hold `Ctrl` and tap `C` again versus hitting `Y` then `Enter`. – Nick T Dec 14 '15 at 18:27
  • 42
    @SebastienDiot You tried out a new technique on a script that had the potential to permanently destroy data? That's... Brave. – Basic Mar 06 '16 at 04:19
  • 3
    @Basic Firstly, it was "my" (personal) database, not the productive system, so only "lost productivity" (download and restore DB again), not "lost data". Secondly, how is "CTRL-C" a "new technique"? :D – Sebastien Diot Mar 07 '16 at 13:38
  • 1
    Twice? Not for me: `^C^CTerminate batch job (Y/N)? ^CTerminate batch job (Y/N)? ^C^CTerminate batch job (Y/N)? ^C` – Post Self Oct 08 '17 at 11:19
  • @kim366 is there any chance you application was restarted automatically? – Kirill V. Lyadvinsky Oct 09 '17 at 09:54
  • @KirillV.Lyadvinsky I don't know. I was terminating an Express server. I am too new to all of this to say for sure – Post Self Oct 09 '17 at 15:01
  • This solution works only 2-3 times in a row. You can create a loop with some long command inside. You will restart loop only few times. And at some point whole terminal windows is closed. – Sergey May 14 '18 at 16:04
  • 2
    @vladr there is a practical difference. If you are running the script from cmd (as opposed to double-clicking the script), `Ctrl c` + `y` puts `y` in command history, which means if you hit `up` key once, you get `y` instead of the actual previous command. `Ctrl c` twice does not have this problem. – cyqsimon Jan 15 '20 at 07:50
  • 1
    This is the best answer, still with Windows 11 – mstram Apr 19 '23 at 05:52
48

Install Clink and change the "terminate_autoanswer" setting. The settings file should be here: 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

This then "just works" with any cmd.exe window. You don't need to alter what's running or otherwise, since clink piggy-backs on cmd.exe. 1

Frickin' awesome, IMO!


1 But you will need to close and reopen cmd.exe before it takes effect.
2 Original unmaintained CLink repo here: http://mridgers.github.io/clink/

Macke
  • 1,203
  • 10
  • 14
  • Clink is fantastic but this doesn't work for me, using cmd.exe or Console2. It still asks and it doesn't get autofilled. – iono Apr 22 '13 at 04:43
  • @tometoftom: Did you change the settings file as above? I had to do that to get it to work. (Note that you have to be an admin to save the file correctly on Windows Vista and up...) – Macke Apr 22 '13 at 07:53
  • Yeah, with the settings changed. I'm an admin :( I tried doing the equivalent of "Run as Administror" for executables by making a shortcut of the settings file, right-click -> Properties, Shortcut tab, Advanced... then "Run as Administrator" is greyed out. – iono Apr 22 '13 at 08:25
  • Run notepad in admin mode, then edit the file. – Macke Apr 23 '13 at 12:00
  • 3
    Ah, still no dice. *deep sigh* Microsoft, for God's sake... – iono Apr 23 '13 at 18:00
  • 3
    @iono do you have non-English Windows version? In this case clink couldn't auto answer the prompt until the 0.4.3 release a few days ago: https://github.com/mridgers/clink/releases/tag/0.4.3 – schlamar Jan 14 '15 at 12:13
  • I can confirm that latest Clink now support French prompt "Terminer le programme de commandes" wonderfully... :-) A long supported nuisance at least removed from my computer! Side note: Clink is a perfect match with ConEmu, the first good substitute for Windows' command prompt I have found. – PhiLho Mar 25 '15 at 09:21
  • 5
    Related: for those **using cmder**, the setting is on`\cmder\config\settings`. See the issue related here https://github.com/cmderdev/cmder/issues/1666 – edmundo096 Feb 27 '18 at 16:54
  • damn it @edmundo096 I discovered the setting and was all proudly ready to make my mark on this post, but then I noticed your comment was buried... d'oh. +1, maybe it'll get unburied now :) – Adam Plocher Nov 17 '18 at 20:35
  • It hooks everywhere perfectly! Most usefull answer of the month! Thanks a lot! (ConEmu stoped working, but it's fine, I just sing cmd now) – Vladimir Ishenko Nov 17 '18 at 22:39
  • 2
    For ConEmu users: the settings location is here: `c:\Program Files\ConEmu\ConEmu\clink\profile\settings`. But you don't need to know it actually. Just run `cmd` under Administartor (to make config file writable, as it's placed under `C:\Program Files` where only admins can change files by default) and run `clink set terminate_autoanswer 1`. This not only sets value for current session, but also writes to config file. You can also see current value if you run this command without last argument. And you can even see the location of config file if you run just `clink set`. – Ruslan Stelmachenko Jun 06 '19 at 19:18
  • On Windows Terminal the "terminate prompt" trashes keyboard input so that keys have to be pressed several times before anything is registered. The clink setting works, but it kind of "auto trashes" the prompt when it occurs. – silverjam Apr 27 '21 at 00:43
  • 4
    The author of original clink has not been updating the project for a while. There's an actualized version in which many issues are solved and features added. Get it: https://chrisant996.github.io/clink/ – Anton Rusak Sep 30 '21 at 09:13
  • @RuslanStelmachenko (`clink set terminate_autoanswer 1` is the best way in Cmder too) – endolith May 03 '23 at 16:02
  • In newer version you can use console command `clink set cmd.auto_answer answer_no`. Use `clink set` to see available settings in case it changes. – Sebi May 31 '23 at 15:48
20

If you don't need to do anything in the batch file after your application finishes normally, then using the start command ensures that the batch file is already finished by the time you press Ctrl-C. And hence the message will not appear.

For example:

@echo off

set my_command=ping.exe
set my_params=-t www.google.com

echo Command to be executed by 'start': %my_command% %my_params%

:: When NOT using /B or /WAIT then this will create a new window, while
:: execution of this very batch file will continue in the current window:

start %my_command% %my_params%

echo.
echo This line will be executed BEFORE 'start' is even finished. So, this
echo batch file will complete BEFORE one presses Ctrl-C in the other window.
echo.

:: Just for testing use 'pause' to show "Press any key to continue", to see
:: the output of the 'echo' commands. Be sure to press Ctrl-C in the window
:: that runs the 'ping' command (not in this very window). Or simply remove
:: the next line when confused:

pause

(Tested on Windows XP.)

Arjan
  • 30,974
  • 14
  • 75
  • 112
sgmoore
  • 6,423
  • 2
  • 25
  • 33
  • I don't know if `start` would indeed help, but it sounds plausible to me. So I wonder if the downvote implies that this would NOT work? Or maybe whoever downvoted does not know Windows' `start` (or especially `start /wait` and `start /b`) command? See http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx then. Please explain the downvote? – Arjan Sep 04 '09 at 18:48
  • `start` won't work. Whenever cmd is running a batch file, tapping Ctrl+C will cause the currently running process to terminate and show the question. – Joey Sep 05 '09 at 08:54
  • All I can say, is that it works for me and the significant point is that the cmd is NOT running a batch file (because it has finished). – sgmoore Sep 05 '09 at 10:15
  • But could one still terminate the application then? So: can Ctrl-C be used to terminate the application that was invoked using `start`? (Still sounds plausible to me...) – Arjan Sep 07 '09 at 12:21
  • Whether Ctrl-C will terminate the application is independent of whether or not the application is run from a batch file. For example, if (in XP) you start c:\windows\system32\edit, it will not respond to the Ctrl-C regardless of how it is run. However defrag does respond to the ctrl-C. So the simpliest way to test this is to create a batch file that simply says start defrag c: – sgmoore Sep 07 '09 at 16:00
  • I'm about to boot an old Windows machine to prove this works, but I already upvoted and me saying it works won't make much difference I guess... So, @vito, did you ever test this answer? This really sounds like the solution that was asked for! – Arjan Sep 27 '09 at 10:39
  • Alright, I finally booted an old Windows machine to confirm this answer. And sgmoore is right, like I already expected. – Arjan Jan 06 '10 at 16:42
  • 1
    +1 works for me. However, /b turns off Ctrl+C handling (which is annoying). – Nick Bolton Apr 10 '10 at 14:58
  • 4
    This is fine if you're double-clicking the batch file. But what if you start the batch file in the console? – Helgi Apr 18 '12 at 18:46
  • 11
    (Speaking from Windows 7, not sure if applicable to XP) The *unthinking* developer hired by *Microsoft* to code the `start` command made the dumb decision to make the **title** of the window both mandatory and optional at the same time - in a rather confusing way. So if ever your `%my_command%` is enclosed in double quotes, it becomes the *title* of the window and the first param in `%my_params%` becomes the *command*. To be safe, use `start "some title here" %my_command% %my_params%`. Most just use `""` and curse the developer for not using a `/TITLE` or `/T` option instead to set the title. – ADTC Jun 25 '15 at 04:09
14

I've been fighting with this desire to avoid the "Terminate batch job" prompt for a little while.

My latest epiphany is a bit of a sleight of hand (or console window), by replacing one instance of cmd.exe with another. This is accomplished by executing the command/program via start cmd /k followed immediately by exit in the .BAT file.

The original console window disappears and the replacement one can be stopped cleanly via Ctrl-C.

Consider the following example of a traceroute that can be interrupted by Ctrl+C, or allowed to complete, returning the user to the C:\> prompt:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

The environment substitution of a new command interpreter may not be for everyone, but, to the naked eye, looks and works well for me.

mklement0
  • 1,899
  • 1
  • 17
  • 22
ViperGeek
  • 388
  • 3
  • 6
  • +1 A very novel approach and although I agree ti's not an exact replacement, it works well (although you did worry me when you started your post with "replacing cmd.exe" - security alarms were ringing until I got to the example and realised what you meant) – Basic Aug 06 '12 at 15:34
  • you should use `exit /b` to exit the batch script – Sebastian Godelet May 07 '15 at 16:23
  • 1
    @SebastianGodelet: That's good advice in general, but here the intent is indeed to close the (original) console _window_, given that the target command is launched in a _new_ window. – mklement0 Jun 16 '18 at 22:35
  • Why use "cmd /k" (keep the interpreter open) instead of "/c"? Just to be able to see the command's output? – Raúl Salinas-Monteagudo Mar 22 '19 at 07:15
13

Gringo's solution is good, but doesn't work well with scripts which pass along the argument list (i.e. python myscript.py %*), since SHIFT doesn't update %*. There are workarounds, but they have certain limitations.

Here's the modification I ended up with:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99.(9)% flawless.

Alec Mev
  • 649
  • 2
  • 9
  • 20
  • 1
    This won't work if `myscript.py` wants to read from stdin. – jamesdlin Jul 29 '17 at 00:09
  • 1
    What I like about this approach is it can be condensed into one line that you just paste at the top of your original script: `IF "%JUSTTERMINATE%" NEQ "OKAY" SET "JUSTTERMINATE=OKAY" & CALL %0 %* – jez Jul 16 '20 at 02:42
7

TCC/LE, which is a free CMD replacement (think of it as CMD++), has an option to suppress the terminate batch job prompt. You can find the option in the TCC Startup Configuration Dialog:

Cancel Batch File on Ctrl-C: Cancel batch file processing without the usual prompt when you press Control-C.

Screenshot:

TCC/LE options

If you've never heard of TCC/LE before, here's some blurb from the site:

TCC/LE is a replacement for the CMD command line (the default Windows command prompt). TCC/LE is a superset of CMD, with 111 internal commands (CMD has fewer than 40), 240 internal variables and functions, and hundreds of enhancements to existing CMD commands.

TCC/LE works with your existing command line applications and batch files, but offers major improvements in command line and batch file capabilities, and adds thousands of new features to your command prompt windows.

I used TCC/LE for years and 4NT before it. I've got a lot of love for it and can recommend it. Only reason I don't still use it is because I almost exclusively use PowerShell now.

Charles Roper
  • 10,599
  • 16
  • 56
  • 75
5

See this Stack Overflow question.

However, patching cmd.exe is not something I would do for that.

Joey
  • 40,002
  • 15
  • 104
  • 126
3

Solution using AutoHotkey

  1. Download and install AutoHotkey

  2. Create a script (e.g. terminate.ahk)

  3. Paste the following script

#SingleInstance Force

#IfWinActive ahk_exe cmd.exe
^d::terminate()

#IfWinActive ahk_exe powershell.exe
^d::terminate()

terminate()
{
    SendInput {Ctrl down}c{Ctrl up}
    Sleep 100
    SendInput y{Enter}
}

  1. Execute the script

Now when you press Ctrl+D in powershell.exe or cmd.exe a Ctrl+C y Enter sequence is sent and that terminates the program.

If want to customize the hotkey, see List of Keys

If you want to apply this hotkey to another program, just add this to the script (e.g. Visual Studio Code -> code.exe):

#IfWinActive ahk_exe code.exe
^d::terminate()

The program name can be found at Task Manager > Details

Marcos
  • 289
  • 2
  • 8
1

Easiest way to suppress the confirmation if you use the Hyper terminal, is to add the hyper-yes plugin.

Ricky Boyce
  • 155
  • 5
0

I ran into this with an EXE that seemed to throw ^C to the parent batch on exit, causing the "Terminate Batch Job" prompt even on a clean exit.

The solution I chose to use was running the batch with "Start", similar to other answers, but from a PowerShell prompt (or via the PowerShell interpreter method from CMD, if you choose).

It's 2018 now, and in Windows 10 Microsoft has begun to supplant CMD with PowerShell as the preferred command prompt, so it's readily available in the GUI, by default.

Start is an alias for Start-Process.

When run, it just launches and returns. So when you stop the launched process, there is no "Terminate Batch Job" prompt.

By default it doesn't wait, so no additional arguments beyond the command and it's arguments are required.

Using start mything.exe -mythings -arguments in my batch worked perfectly.

In PowerShell scripts must be preceded by their path to be launched, so I run my batch file as .\host.bat.

Ƭᴇcʜιᴇ007
  • 111,883
  • 19
  • 201
  • 268
0

A prime reason to suppress the "Terminate batch job (Y/N)", is to run a program in a loop (eg: re-run in case it crashes).

This https://stackoverflow.com/a/8185270/1170023 helped lead to this solution:

@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
)
Kevin
  • 1,253
  • 10
  • 15
0

Simply redirect the batch stdin to null by adding < nul to the end of the command.

Ross Attrill
  • 115
  • 1
  • 1
  • 7
0

In my case it was the ping.bat file that was right in my user directory (C:\Users\ in Vista or C:\Documents and Settings\ in XP) that was holding the batch job indeterminately.

This batch file was executed whenever I ran ping from the command prompt where the current directory is my user directory. Ping-ing from the Run window, or from other user's directory was running well.

Removed the file from my user dir and the problem was resolved!

-4

At the end of your script, just add the following command:

echo

This will not "damage" the behavior of your script, and it seems to prevent CMD to ask if you want to termininate the batch.

Star
  • 3
  • 3
Henri
  • 1