Question Comment supprimer "Terminate batch job (Y / N)" confirmation?


Dans cmd, lorsque nous appuyons sur Ctrl + C, l'application cible est arrêtée, mais si l'application cible est appelée à partir d'un fichier de commandes, nous obtenons la confirmation "Terminer le travail par lots (O / N)". Je ne me souviens jamais d'une instance où j'ai choisi de ne pas terminer le travail par lots. Comment pouvons-nous sauter cette confirmation?


125
2017-09-04 12:39


origine


Avez-vous déjà essayé la réponse de sgmoore? superuser.com/questions/35698/ - Arjan
"Je ne me souviens jamais d’une instance 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 batch se termine après avoir entré 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épensent beaucoup trop d'efforts pour éviter cette gêne mineure. Je suis juste contrarié qu'il n'y ait pas de moyen simple de résoudre ce problème. Sérieusement Microsoft, quel est le but de cette invite? Oui je suis sûr, c'est pour ça que je frappe Ctrl + C ... - Chev
Ce problème me fait au moins me rappeler et utiliser le -n changer pour cygwin ping plus souvent. - palswim


Réponses:


AFAIK vous ne pouvez pas car ce comportement est par conception et contrôlé par l'interpréteur de commandes. Il n'y a pas de méthode pour "mapper" ou même "intercepter" ceci sauf si vous décompilez et recompilez directement l'interpréteur.


41
2017-09-04 12:42



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
Bien que cela puisse être vrai, l’interprète ne peut pas se comporter différemment, en utilisant start comme sgmoore suggéré à superuser.com/questions/35698/ semble être une solution parfaite pour moi. - Arjan
C'est ici: superuser.com/a/498798/56101 - Totty.js


presse Ctrl+C deux fois.


51
2017-09-04 18:28



Cela ne fonctionnera pas mais répète plutôt l'invite. - Joey
a parfaitement fonctionné pour moi, merci! - captainclam
Je viens de tuer ma base de données en faisant ça! Le script attendait "pause", donc j'ai fait CTRL-C, puis l'invite est arrivée, alors j'ai refait CTRL-C, puis le fichier de commandes s'est poursuivi et a supprimé ma base de données! @voir superuser.com/questions/740004/ - Sebastien Diot
@vladr il est infiniment plus facile à tenir Ctrl et appuyez sur C à nouveau contre frapper Y puis Enter. - Nick T
@ SébastienDiot Vous avez essayé une nouvelle technique sur un script susceptible de détruire définitivement des données? C'est ... Brave. - Basic


À ceci site, J'ai trouvé une solution efficace:

script2.cmd < nul

Pour ne pas avoir à taper ceci chaque fois que j'ai fait un deuxième script appelé script.cmd dans le même dossier avec la ligne ci-dessus. J'ai testé cette technique sur XP uniquement, mais d'autres l'ont confirmé sur Windows 7.

Nathan ajoute: une autre option est de mettre le code suivant en haut de script.cmd qui fait la même chose dans un 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
)

41
2017-11-03 03:29



Si vous appelez un fichier batch depuis lui-même (sans utiliser la commande CALL), l'exécution est "définitivement" transférée. 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
Cela fonctionne dans Windows 7. - William
Cela fonctionne, à moins que vous ayez besoin de la saisie de l'utilisateur dans le lot. - Augusto Men
@William, le simple fait d'appeler le script ne fonctionnait pas pour moi, mais j'ai trouvé une solution: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). S'appelle récursivement, mais avec un argument la deuxième fois. Si votre script a des arguments, vous pouvez éventuellement utiliser le premier argument de position inutilisé. 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. Cela fait-il écho au sacré Terminate (y / n)? message à la fin alors, mais ne s'arrête pas pour cela. - ggb667


Installer Choquer 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

Ceci "fonctionne juste" avec n'importe quelle fenêtre de cmd.exe. Vous n'avez pas besoin de modifier ce qui est en cours d'exécution ou non, car le clink est relié à cmd.exe.

Frickin 'génial, IMO!


22
2018-04-03 06:50



Clink est fantastique mais cela ne fonctionne pas pour moi, en utilisant cmd.exe ou Console2. Il demande toujours et il ne se remplit pas automatiquement. - iono
@tometoftom: Avez-vous modifié le fichier de paramètres comme ci-dessus? Je devais le faire pour que ça marche. (Notez que vous devez être un administrateur pour enregistrer le fichier correctement sur Windows Vista et les versions ultérieures ...) - Macke
Oui, avec les paramètres modifiés. Je suis un administrateur :( J'ai essayé de faire l'équivalent de "Exécuter en tant qu'administrateur" pour les exécutables en faisant un raccourci du fichier de paramètres, clic droit -> Propriétés, onglet Raccourci, Avancé ... puis "Exécuter en tant qu'administrateur" est grisé. - iono
Ah, toujours pas de dés. soupir profond Microsoft, pour l'amour de Dieu ... - iono
@iono avez-vous une version Windows non anglaise? Dans ce cas, clink n'a pas pu répondre automatiquement à l'invite jusqu'à la publication de la version 0.4.3 il y a quelques jours: github.com/mridgers/clink/releases/tag/0.4.3 - schlamar


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

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, alors que
:: l'exécution de ce fichier batch continuera dans la fenêtre courante:

démarrer% my_command%% my_params%

écho.
echo Cette ligne sera exécutée AVANT que 'start' soit même terminé. Donc ça
Le fichier de commandes d'écho se terminera 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
:: 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 supprimer
:: la ligne suivante quand confus:

pause

(Testé sur Windows XP.)


15
2017-09-04 13:33



Je ne sais pas si start serait en effet utile, mais cela semble plausible pour moi. Donc, je me demande si la baisse implique que cela ne fonctionnerait pas? Ou peut-être que ceux qui ont voté ne connaissent pas Windows ' start (ou surtout start /wait et start /b) commande? Voir microsoft.com/resources/documentation/windows/xp/all/proddocs/... puis. S'il vous plaît expliquer le downvote? - Arjan
start ne fonctionnera pas. Chaque fois que cmd exécute un fichier de commandes, appuyez sur Ctrl + C pour que le processus en cours se termine et affiche la question. - Joey
+1 fonctionne pour moi. Cependant, / b désactive la gestion de Ctrl + C (ce qui est agaçant). - Nick Bolton
C'est bien si vous double-cliquez sur le fichier de commandes. Mais que faire si vous démarrez le fichier de commandes dans la console? - Helgi
(Parlant de Windows 7, pas sûr si applicable à XP) Le irréfléchi développeur engagé par Microsoft pour coder le start commande a pris la décision stupide de faire le Titre de la fenêtre à la fois obligatoire et facultative en même temps - d'une manière plutôt confuse. Donc, si jamais votre %my_command%est placé entre guillemets, il devient le Titre de la fenêtre et le premier paramètre dans %my_params% devient le commander. Pour être sûr, utilisez start "some title here" %my_command% %my_params%. La plupart utilisent juste "" et maudire le développeur pour ne pas utiliser un /TITLE ou /T option au lieu de définir le titre. - ADTC


Je me suis battu avec ce désir d'éviter le message "Terminate batch job" pendant un petit 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 avec un autre. Ceci est accompli en exécutant la commande / programme via start cmd /k suivi immédiatement par exit dans le .BAT fichier.

La fenêtre de la console d'origine disparaît et le remplacement peut être arrêté correctement via Ctrl-C.

Considérons l'exemple suivant d'un traceroute qui peut être interrompu par Ctrl+C, ou autorisé à terminer, renvoyer l'utilisateur au C:\> rapide:

@echo off

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

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

La substitution de l'environnement d'un nouvel interpréteur de commandes peut ne pas être pour tout le monde, mais, à l'œil nu, regarde et fonctionne bien pour moi.


12
2018-05-16 17:05



+1 Une approche très novatrice et même si je suis d'accord pour dire que ce n'est pas un remplacement exact, cela fonctionne bien (même si vous avez commencé à publier cmd.exe avec votre article) - les alarmes de sécurité se sont arrêtées ce que tu voulais dire) - Basic
Tu devrais utiliser exit /b pour quitter le script de lot - Sebastian Godelet
@SebastianGodelet: C'est un bon conseil en général, mais ici l'intention est bien de fermer la console (d'origine) fenêtre, étant donné que la commande cible est lancée dans un Nouveau fenêtre. - mklement0


La solution de Gringo est bonne, mais ne fonctionne pas bien avec les scripts qui passent le long de la liste d’arguments (c.-à-d. python myscript.py %*), depuis SHIFT ne met pas à jour %*. Il y a solutions de contournement, mais ils ont certaines limitations.

Voici la modification avec laquelle je me suis retrouvé avec:

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

99. (9)% sans défaut.


7
2018-02-12 11:33



Cela ne fonctionnera pas si myscript.py veut lire stdin. - jamesdlin


Voir cette question de débordement de pile.

Cependant, corriger cmd.exe n'est pas quelque chose que je ferais pour cela.


5
2017-09-04 18:21





Dans mon cas, c'était le fichier ping.bat qui se trouvait dans mon répertoire utilisateur (C: \ Users \ sous Vista ou C: \ Documents and Settings \ sous XP) qui contenait indéfiniment le travail par lots.

Ce fichier de commandes a été exécuté chaque fois que j'ai exécuté ping à partir de l'invite de commande où le répertoire en cours est mon répertoire utilisateur. Ping-ing à partir de la fenêtre Run, ou à partir du répertoire des autres utilisateurs fonctionnait bien.

Supprimé le fichier de mon répertoire utilisateur et le problème a été résolu!


0
2018-01-06 14:08





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


0
2018-03-17 20:08





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


0
2018-02-22 16:15



Je pense que vous avez peut-être voulu dire <nul (le nul envoie tous les stdout à null). - Brian Phillips