Comment supprimer la confirmation «Terminer le traitement par lots (O / N)»?

154

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?

Srikanth
la source
Avez-vous déjà essayé la réponse de sgmoore? superuser.com/questions/35698/…
Arjan
10
"Je ne me souviens jamais d'un cas où j'ai choisi de ne pas terminer le travail par lots." Et effectivement, dans la plupart des cas, le travail est terminé, même si vous répondez Non ...
PhiLho
@PhiLho - Cela ne peut pas être vrai, car mes scripts continuent toujours après mon entrée N. Je suis curieux de savoir quel scénario vous avez où le script de traitement par lots se termine après votre entrée N.
Dbenham
J'espérais que ce serait facile, mais comme d'habitude, Microsoft a fait quelque chose de simple, une douleur dans le cul. Les réponses ci-dessous déploient beaucoup trop d’efforts pour éviter ce désagrément mineur. Je suis juste ennuyé qu'il n'y ait pas de moyen simple de résoudre ce problème. Sérieusement Microsoft, à quoi sert cette invite? Oui, j'en suis sûr, c'est pourquoi j'ai appuyé sur Ctrl + C ...
Chev
Ce problème me force au moins à me souvenir et à utiliser le -ncommutateur pour le ping cygwin plus souvent.
palswim

Réponses:

52

Autant que je sache, ce comportement est conçu et est contrôlé par l’interpréteur de commandes. 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.

BinaryMisfit
la source
39
C'est décevant :(
Srikanth
Oui c'est décevant. Ce qui est encore plus décevant, c'est que la commande BREAK, qui par défaut ne fait rien sous XP, aurait pu être utilisée pour basculer l'invite…
Synetech
3
Bien que cela puisse être vrai, on ne peut pas faire en sorte que l'interprète se comporte différemment, utiliser la startméthode suggérée par sgmoore à l'adresse superuser.com/questions/35698/ semble tout à fait parfait.
Arjan
1
La voici: superuser.com/a/498798/56101
Totty.js
58

Appuyez deux fois sur Ctrl+ C.

Kirill V. Lyadvinsky
la source
5
Cela ne fonctionnera pas mais plutôt répète l'invite.
Joey
8
Je viens de tuer ma base de données en faisant ça! Le script attendait en "pause", j'ai donc utilisé CTRL-C, puis l'invite est arrivée. J'ai donc refait CTRL-C, puis le fichier de commandes a continué à fonctionner et a supprimé ma base de données! @see superuser.com/questions/740004/…
Sebastien Diot
2
Ce n'est pas ce que le PO a demandé. Il pourrait tout aussi bien taper "N" après ^ C.
vladr
3
@vladr, il est infiniment plus facile de tenir Ctrlet de taper à Cnouveau que de frapper Yensuite Enter.
Nick T
21
@SebastienDiot Vous avez essayé une nouvelle technique sur un script pouvant potentiellement détruire des données de manière permanente? C'est ... courageux.
Basic
58

Sur ce site , j'ai trouvé une solution efficace:

script2.cmd < nul

Pour ne pas avoir à taper cela chaque fois que j'ai fait un deuxième script appelé script.cmddans le même dossier avec la ligne ci-dessus. J'ai testé cette technique sur XP uniquement, mais d'autres l'ont confirmée sur 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
)
Gringo Suave
la source
2
Si vous appelez un fichier de commandes à partir de lui-même (sans utiliser la commande CALL), l'exécution est transférée "de manière permanente". Si STDIN est redirigé vers NUL, toute invite "Terminate Batch Job" apparaîtra toujours, mais n'attendra pas (car STDIN est parti) pour la saisie. Cela fonctionne pour moi ...
William
3
Cela fonctionne dans Windows 7.
William
17
Cela fonctionne, sauf si vous avez besoin de la saisie de l'utilisateur dans le lot.
Augusto Men
2
@William, appelant juste le script ne fonctionne pas pour moi, mais je suis venu avec une solution de contournement: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). S'appelle de manière récursive, mais avec un argument la deuxième fois. Si votre script a des arguments, vous pouvez éventuellement utiliser le premier argument de position non utilisé. Cela pourrait être problématique si votre script a beaucoup d'arguments. Mon script n'a pas besoin d'arguments ni de saisie utilisateur.
jpmc26
La réponse de jpmc a fonctionné pour moi. Est-ce qu'il fait écho à la fin Terminer (y / n)? le message se termine alors, mais ne s'arrête pas pour cela.
ggb667
29

Installez Clink et modifiez le paramètre "terminate_autoanswer". Le fichier de paramètres doit ê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, car clink piggy-backs sur cmd.exe.

Frickin 'génial, IMO!

Macke
la source
Clink est fantastique, mais cela ne fonctionne pas pour moi, avec cmd.exe ou Console2. Il demande toujours et il n'est pas rempli automatiquement.
iono
@tometoftom: Avez-vous modifié le fichier de paramètres comme ci-dessus? Je devais le faire pour que ça fonctionne. (Notez que vous devez être un administrateur pour enregistrer le fichier correctement sous Windows Vista et supérieur ...)
Macke
3
Ah, toujours pas de dés. profond soupir Microsoft, pour l'amour de Dieu ...
iono
3
@iono avez-vous une version non anglaise de Windows? Dans ce cas, clink n'a pas pu répondre automatiquement à l'invite jusqu'à la sortie de la version 0.4.3 il y a quelques jours: github.com/mridgers/clink/releases/tag/0.4.3
schlamar
3
Connexe: pour ceux qui utilisent cmder , le réglage est activé\cmder\config\settings . Voir la question liée ici github.com/cmderdev/cmder/issues/1666
edmundo096
17

Si vous n'avez rien à faire dans le fichier de commandes après la fin normale de votre application, utilisez la startcommande 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:

@Écho off

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

echo Commande à exécuter par 'start':% my_command%% my_params%

:: Si vous n'utilisez pas / B ou / WAIT, une nouvelle fenêtre sera créée, tandis que
:: l'exécution de ce fichier de commandes continuera dans la fenêtre actuelle:

démarrer% ma_commande%% mes_paramnes%

écho.
echo Cette ligne sera exécutée AVANT que 'start' soit même terminé. Donc ça
Le fichier batch echo sera terminé AVANT que l’on n’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
:: la sortie des commandes 'echo'. Assurez-vous d'appuyer sur Ctrl-C dans la fenêtre
:: qui exécute la commande 'ping' (pas dans cette fenêtre même). Ou simplement enlever
:: la prochaine ligne quand confuse:

pause

(Testé sous Windows XP.)

sgmoore
la source
Je ne sais pas si startcela aiderait, mais cela me semble plausible. Je me demande donc si le vote par la voix implique que cela ne fonctionnerait pas? Ou peut-être que celui qui a un vote négatif ne connaît pas la commande de Windows start(ou spécialement start /waitet start /b)? Voir ensuite microsoft.com/resources/documentation/windows/xp/all/proddocs/… . S'il vous plaît expliquer le downvote?
Arjan
startne fonctionnera pas. Chaque fois que cmd exécute un fichier de commandes, appuyez sur Ctrl + C pour terminer le processus en cours et afficher la question.
Joey
1
+1 fonctionne pour moi. Cependant, / b désactive la gestion Ctrl + C (ce qui est agaçant).
Nick Bolton
3
Cela convient si vous double-cliquez sur le fichier de commandes. Mais que se passe-t-il si vous démarrez le fichier de commandes dans la console?
Helgi
8
(Parlant de Windows 7, pas sûr s’il s’applique à XP) Le développeur irréfléchi engagé par Microsoft pour coder la startcommande a pris la décision stupide de rendre le titre de la fenêtre à la fois obligatoire et facultatif - de manière assez déroutante. Donc, si jamais votre %my_command%est placé entre guillemets, il devient le titre de la fenêtre et le premier paramètre %my_params%devient la commande . Pour être en sécurité, utilisez start "some title here" %my_command% %my_params%. La plupart n'utilisent ""et ne maudissent que le développeur qui n'utilise pas d' option /TITLEou /Tpour définir le titre.
ADTC
13

Cela fait un petit moment que je me bats avec cette volonté d'éviter l'invite "Terminate batch job".

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.exeune autre. Ceci est accompli en exécutant la commande / programme via start cmd /ksuivi immédiatement par exitdans le .BATfichier.

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.

Prenons l'exemple suivant traceroutequi peut être interrompu par Ctrl+ Cou autorisé à se terminer, renvoyant l'utilisateur à l' C:\>invite:

@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.

ViperGeek
la source
+1 Une approche très nouvelle et bien que je sois d'accord sur le fait que ce n'est pas un remplacement exact, cela fonctionne bien (bien que vous m'ayez inquiété lorsque vous avez commencé votre message avec "le remplacement de cmd.exe" - les alarmes de sécurité sonnaient jusqu'à ce que je prenne l'exemple et me rende compte ce que vous vouliez dire)
Basic
vous devriez utiliser exit /bpour sortir du script batch
Sebastian Godelet
1
@SebastianGodelet: C'est un bon conseil en général, mais il s'agit bien de fermer la fenêtre de la console (d'origine) , étant donné que la commande cible est lancée dans une nouvelle fenêtre.
mklement0
Pourquoi utiliser "cmd / k" (garder l'interprète ouvert) au lieu de "/ c"? Juste pour pouvoir voir le résultat de la commande?
Raúl Salinas-Monteagudo
9

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 SHIFTne 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.

Olegs Jeremejevs
la source
Cela ne fonctionnera pas si myscript.pyveut lire stdin.
jamesdlin
0

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!


la source
0

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épondra pas).


la source
0

Il suffit de rediriger le lot stdin vers null en ajoutant <nul à la fin de la commande.

Il Cognato
la source
2
Je pense que vous avez peut-être voulu dire <nul (comme le> nul envoie tous les stdout à null).
Brian Phillips
0

J'ai rencontré ce problème avec un fichier EXE qui semblait jeter ^ C dans le lot parent à la sortie, ce qui a provoqué l'invite "Terminate Batch Job", même lors d'une sortie en mode minimal.

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.

Startest 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.

L'utilisation start mything.exe -mythings -argumentsde 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 en tant que .\host.bat.

Ƭᴇcʜιᴇ007
la source
0

TCC / LE , qui est un remplacement CMD libre (pensez à CMD ++), a une option pour supprimer l’invite de fin de traitement par lots. Vous pouvez trouver l'option dans la boîte de dialogue Configuration de démarrage TCC :

Annuler le fichier batch en Ctrl-C : Annulez le traitement du fichier batch sans l'invite habituelle lorsque vous appuyez sur Ctrl-C.

Capture d'écran:

Options TCC / LE

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 en termes de fonctionnalités de ligne de commande et de fichiers 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.

Charles Roper
la source
0

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).

Ce 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
)
kevinf
la source
-2

Le moyen le plus simple de supprimer la confirmation si vous utilisez le terminal Hyper , consiste à ajouter le plug - in hyper-yes .

Ricky Boyce
la source
Pourquoi le vote négatif? J'ai noté en utilisant uniquement Hyper. C'est en fait une excellente solution que j'utilise lors de l'utilisation de Windows.
Ricky Boyce
1
La question concerne cmd.exe.
Raúl Salinas-Monteagudo
-3

À la fin de votre script, ajoutez simplement la commande suivante:
echo
Cela n'endommagera pas le comportement de votre script et empêchera apparemment CDM de vous demander si vous souhaitez mettre fin au lot.

Henri
la source
5
Ca n'a pas marché pour moi.
Helgi