Dans cmd, lorsque nous appuyons sur Ctrl + C, l'application cible est terminée, mais si l'application cible est appelée à partir d'un fichier de traitement par lots, nous obtenons cette confirmation "Terminate batch job (Y/N)". Je ne peux jamais me souvenir d'un cas où j'ai choisi de ne pas terminer le travail par lots. Comment pouvons-nous ignorer cette confirmation?
Autant que je sache, ce comportement est conçu et est contrôlé par l’interprète de commande. Il n'y a pas de méthode de "mappage" ou même d '"interception", sauf si vous décompilez et recompilez directement l'interpréteur.
Presse Ctrl+C deux fois.
Sur ce site , j'ai trouvé une solution efficace:
script2.cmd < nul
Pour ne pas avoir à taper ceci chaque fois que j'ai créé un deuxième script appelé script.cmd
dans le même dossier que la ligne ci-dessus. J'ai testé cette technique sur XP uniquement, mais d'autres l'ont confirmée sous Win 7.
Nathan ajoute: une autre option consiste à placer le code suivant en haut de script.cmd, qui fait la même chose dans un seul fichier:
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
)
Installez Clink et modifiez le paramètre "terminate_autoanswer". Le fichier de paramètres devrait être ici : 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
Cela fonctionne alors "avec n'importe quelle fenêtre" cmd.exe. Vous n'avez pas besoin de modifier ce qui est en cours d'exécution ou autre, puisque clink se greffe sur cmd.exe.
Frickin 'génial, IMO!
Si vous n'avez rien à faire dans le fichier de commandes après la fin normale de votre application, utilisez la commande start
pour vous assurer que le fichier de commandes est déjà terminé au moment où vous appuyez sur Ctrl-C. Et par conséquent, le message n'apparaîtra pas.
Par exemple:
@echo off Définir my_command = ping.exe Définir my_params = -t www.google.com echo Commande à exécuter par 'start':% my_command%% my_params% :: Si vous n'utilisez PAS/B ou/WAIT, cela créera une nouvelle fenêtre, tandis que :: exécution de ce même le fichier batch continuera dans la fenêtre actuelle: démarrer% ma_commande%% mes_paramnes% echo. echo Cette ligne sera exécutée AVANT 'start' est même fini. Donc, ce fichier batch Écho sera terminé AVANT que l’on appuie sur Ctrl-C dans l’autre fenêtre. Écho. :: Juste pour tester, utilisez 'pause' pour afficher "Appuyez sur n'importe quelle touche pour continuer", pour voir :: le résultat des commandes 'echo'. Assurez-vous d'appuyer sur Ctrl-C dans la fenêtre :: qui exécute la commande 'ping' (pas dans cette même fenêtre). Ou supprimez simplement :: la ligne suivante lorsque confondu: Pause
(Testé sous Windows XP.)
Je me bats avec ce désir d'éviter l'invite "Terminate batch job" depuis un moment.
Ma dernière épiphanie est un peu un tour de passe-passe (ou une fenêtre de console), en remplaçant une instance de cmd.exe
par une autre. Ceci est accompli en exécutant la commande/le programme via start cmd /k
suivi immédiatement de exit
dans le fichier .BAT
.
La fenêtre de la console d'origine disparaît et la fenêtre de remplacement peut être arrêtée proprement via Ctrl-C.
Considérons l’exemple suivant de traceroute
qui peut être interrompu par Ctrl+C, ou autorisé à terminer, en renvoyant l'utilisateur à l'invite C:\>
:
@echo off
set timeout=100
if not "%2"=="" set timeout=%2
start cmd /k tracert -w %timeout% %1
exit
Le remplacement de l'environnement par un nouvel interpréteur de commande peut ne pas convenir à tout le monde, mais, à l'œil nu, il a l'air et fonctionne bien pour moi.
La solution de Gringo est bonne, mais ne fonctionne pas bien avec les scripts qui transmettent la liste des arguments (c'est-à-dire python myscript.py %*
), car SHIFT
ne met pas à jour %*
. Il existe des solutions de contournement , mais elles ont certaines limitations.
Voici la modification avec laquelle je me suis retrouvé:
IF [%JUSTTERMINATE%] == [OKAY] (
SET JUSTTERMINATE=
python myscript.py %*
) ELSE (
SET JUSTTERMINATE=OKAY
CALL %0 %* <NUL
)
99. (9)% sans défaut.
Voir cette question de débordement de pile .
Cependant, corriger cmd.exe n'est pas quelque chose que je ferais pour cela.
Démarrer fonctionne, mais maintenant la fenêtre ouverte par le fichier de commandes est modifiée à partir des options que j'avais et les "propriétés" sont désactivées (ne répond pas).
Je me suis heurté à cela avec un EXE qui semblait jeter ^ C au lot parent à la sortie, ce qui provoquait l'invite "Terminate Batch Job", même en cas de sortie propre.
La solution que j'ai choisie consistait à exécuter le lot avec "Démarrer", comme pour d'autres réponses, mais à partir d'une invite PowerShell (ou via la méthode d'interprétation PowerShell de CMD, si vous le souhaitez).
Nous sommes en 2018 et sous Windows 10, Microsoft a commencé à supplanter CMD avec PowerShell en tant qu'invite de commande préférée. Il est donc facilement disponible dans l'interface graphique par défaut.
Start
est un alias pour Start-Process .
Lorsqu'il est exécuté, il se lance et revient. Ainsi, lorsque vous arrêtez le processus lancé, il n'y a pas d'invite "Terminate Batch Job".
Par défaut, il n'attend pas et aucun argument supplémentaire n'est requis au-delà de la commande et ses arguments.
Utiliser start mything.exe -mythings -arguments
dans mon lot a parfaitement fonctionné.
Dans PowerShell, les scripts doivent être précédés de leur chemin pour être lancés. Je lance donc mon fichier de commandes au format .\Host.bat
.
Une des principales raisons de supprimer le "travail par lots à terminer (O/N)" consiste à exécuter un programme en boucle (par exemple: à réexécuter au cas où il tomberait en panne).
Ceci https://stackoverflow.com/a/8185270/1170023 a contribué à cette 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
)
Il suffit de rediriger le lot stdin vers null en ajoutant <nul à la fin de la commande.
Dans mon cas, c’est le fichier ping.bat qui se trouvait dans mon répertoire utilisateur (C:\Utilisateurs\sous Vista ou C:\Documents et paramètres\sous XP) qui retenait le travail par lots indéterminé.
Ce fichier de commandes était exécuté chaque fois que j'exécutais une commande ping à partir de l'invite de commande, où le répertoire actuel est mon répertoire utilisateur. Le ping depuis la fenêtre Exécuter ou depuis le répertoire d'un autre utilisateur fonctionnait bien.
Suppression du fichier de mon répertoire utilisateur et le problème a été résolu!
TCC/LE , qui est un remplacement gratuit de CMD (considérez-le comme CMD ++), dispose d'une option permettant de supprimer l'invite du travail par lots de fin. Vous pouvez trouver cette option dans la boîte de dialogue de configuration de démarrage TCC :
Annuler le fichier de traitement par lots sur Ctrl-C : Annule le traitement du fichier de traitement sans l'invite habituelle lorsque vous appuyez sur les touches Ctrl-C.
Capture d'écran:
Si vous n'avez jamais entendu parler de TCC/LE, voici un texte de présentation du site:
TCC/LE remplace la ligne de commande CMD (l'invite de commande Windows par défaut). TCC/LE est un sur-ensemble de CMD, avec 111 commandes internes (CMD en a moins de 40), 240 variables et fonctions internes et des centaines d’améliorations aux commandes CMD existantes.
TCC/LE fonctionne avec vos applications de ligne de commande et vos fichiers de commandes existants, mais offre des améliorations majeures dans les fonctionnalités de ligne de commande et de fichier de commandes, et ajoute des milliers de nouvelles fonctionnalités à vos fenêtres d'invite de commande.
J'ai utilisé TCC/LE pendant des années et 4SA avant. J'ai beaucoup d'amour pour ça et je peux le recommander. La seule raison pour laquelle je ne l'utilise toujours pas, c'est que j'utilise presque exclusivement PowerShell maintenant.