Come sopprimere la conferma "Termina processo batch (S / N)"?


154

In cmd, quando si preme Ctrl + C, l'applicazione di destinazione viene terminata ma se l'applicazione di destinazione viene chiamata da un file batch, si ottiene questa conferma "Termina processo batch (S / N)". Non ricordo mai un'istanza in cui ho scelto di non interrompere il processo batch. Come possiamo saltare questa conferma?


Hai mai provato la risposta di sgmoore? superuser.com/questions/35698/…
Arjan,

10
"Non ricordo mai un'istanza in cui ho scelto di non interrompere il processo batch." E in realtà, nella maggior parte dei casi, il lavoro viene interrotto anche se rispondi No ...
PhiLho

@PhiLho - Non può essere vero, poiché i miei script continuano sempre dopo che ho inserito N. Sono curioso di sapere quale scenario hai in cui termina lo script batch dopo aver inserito N.
dbenham,

Speravo che fosse facile, ma come al solito Microsoft ha reso qualcosa di semplice un dolore nel culo. Le risposte che seguono sono tutte troppo impegnative per evitare questo piccolo fastidio. Sono solo infastidito dal fatto che non esiste un modo semplice per risolverlo. Scherzi a parte Microsoft, qual è lo scopo di questo prompt? Sì, sono sicuro, ecco perché ho premuto Ctrl + C ...
Chev

Questo problema mi sta almeno facendo ricordare e utilizzare più spesso l' -ninterruttore per il cygwin ping .
Palswim,

Risposte:


52

AFAIK non è possibile in quanto questo comportamento è progettato e controllato dall'interprete dei comandi. Non esiste un metodo per "mappare" o addirittura "intercettare" ciò a meno che non si decompilino e ricompilino direttamente l'interprete.


39
È deludente :(
Srikanth,

Sì, è deludente. La cosa ancora più deludente è che il comando BREAK, che per impostazione predefinita non fa nulla sotto XP, avrebbe potuto essere usato per attivare il prompt ...
Synetech,

3
Anche se potrebbe essere vero, non si può fare in modo che l'interprete si comporti in modo diverso, usando startcome sgmoore suggerito su superuser.com/questions/35698/… mi sembra una soluzione perfettamente valida .
Arjan,


58

Premi Ctrl+ Cdue volte.


5
Questo non funzionerà ma piuttosto ripeterà il prompt.
Joey,

8
Ho appena ucciso il mio database facendolo! Lo script era in attesa di "pausa", quindi ho fatto CTRL-C, e poi è arrivato il prompt, quindi ho fatto di nuovo CTRL-C, quindi il file batch ha continuato e cancellato il mio database! @vedi superuser.com/questions/740004/…
Sebastien Diot il

2
Non è quello che ha chiesto l'OP. Poteva digitare facilmente "N" dopo ^ C.
Vladr,

3
@vladr è infinitamente più facile da tenere Ctrle toccare Cdi nuovo rispetto a colpire Ypoi Enter.
Nick T,

21
@SebastienDiot Hai provato una nuova tecnica su uno script che aveva il potenziale per distruggere permanentemente i dati? Questo è ... Brave.
Base

58

In questo sito ho trovato una soluzione efficace:

script2.cmd < nul

Per non doverlo scrivere ogni volta che ho creato un secondo script chiamato script.cmdnella stessa cartella con la riga sopra. Ho testato questa tecnica solo su XP, ma altri l'hanno confermata su Win 7.

Nathan aggiunge: un'altra opzione è quella di mettere il seguente codice all'inizio di script.cmd che fa la stessa cosa in un 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
)

2
Se si chiama un file batch dall'interno (senza utilizzare il comando CALL), l'esecuzione viene trasferita "permanentemente". Se STDIN viene reindirizzato a NUL, qualsiasi prompt "Termina processo batch" verrà comunque visualizzato, ma non attenderà (poiché STDIN è sparito) per l'input. Questo funziona per me ...
William,

3
Funziona su Windows 7.
William,

17
Funziona, a meno che non sia necessario l'input dell'utente nel batch.
Augusto Men,

2
@William, Basta chiamare lo script non ha funzionato per me, ma mi si avvicinò con una soluzione: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Si chiama ricorsivamente, ma con una discussione la seconda volta. Se lo script contiene argomenti, è possibile utilizzare il primo argomento posizionale non utilizzato. Ciò potrebbe essere problematico se la tua sceneggiatura ha molti argomenti. Il mio script non aveva bisogno di argomenti o input dell'utente.
jpmc26,

La risposta di jpmc ha funzionato per me. Fa eco al maledetto Terminate (y / n)? il messaggio alla fine però però, ma non si ferma a questo.
ggb667,

29

Installa Clink e modifica l'impostazione "terminate_autoanswer". Il file delle impostazioni dovrebbe essere qui : 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

Questo quindi "funziona" con qualsiasi finestra cmd.exe. Non è necessario modificare ciò che è in esecuzione o in altro modo, poiché il tintinnio di spalle su cmd.exe.

Fottutamente fantastico, IMO!


Il clink è fantastico ma questo non funziona per me, usando cmd.exe o Console2. Chiede ancora e non si riempie automaticamente.
iono il

@tometoftom: hai modificato il file delle impostazioni come sopra? Ho dovuto farlo per farlo funzionare. (Nota che devi essere un amministratore per salvare correttamente il file su Windows Vista e versioni successive ...)
Macke

3
Ah, ancora nessun dado. sospiro profondo Microsoft, per l'amor di Dio ...
iono il

3
@iono hai una versione Windows non inglese? In questo caso il clink non poteva rispondere automaticamente al prompt fino alla versione 0.4.3 di qualche giorno fa: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
Correlati: per coloro che usano cmder , l'impostazione è attiva \cmder\config\settings. Vedi il problema relativo qui github.com/cmderdev/cmder/issues/1666
edmundo096

17

Se non è necessario eseguire alcuna operazione nel file batch dopo che l'applicazione termina normalmente, l'utilizzo del startcomando garantisce che il file batch sia già terminato quando si preme Ctrl-C. E quindi il messaggio non verrà visualizzato.

Per esempio:

@echo off

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

echo Comando che deve essere eseguito da 'start':% my_command%% my_params%

:: Quando NON si utilizza / B o / WAIT, questo creerà una nuova finestra, mentre
:: l'esecuzione di questo file batch continuerà nella finestra corrente:

start% my_command%% my_params%

eco.
echo Questa riga verrà eseguita PRIMA che 'start' sia addirittura terminato. Così questo
il file batch echo verrà completato PRIMA di premere Ctrl-C nell'altra finestra.
eco.

:: Solo per il test usa 'pause' per mostrare "Premi un tasto qualsiasi per continuare", per vedere
:: l'output dei comandi 'echo'. Assicurati di premere Ctrl-C nella finestra
:: che esegue il comando 'ping' (non proprio in questa finestra). O semplicemente rimuovi
:: la riga successiva se confuso:

pausa

(Testato su Windows XP.)


Non so se startsarebbe davvero d'aiuto, ma mi sembra plausibile. Quindi mi chiedo se il downvote implica che NON funzionerebbe? O forse chi ha effettuato il downgrade non conosce il comando start(o soprattutto start /waite start /b) di Windows ? Vedi microsoft.com/resources/documentation/windows/xp/all/proddocs/…, quindi. Per favore, spiega il downvote?
Arjan,

startnon funzionerà. Ogni volta che cmd esegue un file batch, toccando Ctrl + C si interromperà il processo in esecuzione e verrà visualizzata la domanda.
Joey,

1
+1 funziona per me. Tuttavia, / b disattiva la gestione Ctrl + C (che è fastidioso).
Nick Bolton,

3
Questo va bene se fai doppio clic sul file batch. Ma cosa succede se si avvia il file batch nella console?
Helgi,

8
(Parlando da Windows 7, non sicuro se applicabile a XP) Lo sviluppatore sconsiderato assunto da Microsoft per codificare il startcomando ha preso la muta decisione di rendere il titolo della finestra sia obbligatorio che facoltativo allo stesso tempo - in un modo piuttosto confuso. Quindi, se mai il tuo %my_command%è racchiuso tra virgolette doppie, diventa il titolo della finestra e il primo parametro in %my_params%diventa il comando . Per sicurezza, usa start "some title here" %my_command% %my_params%. Molti usano ""e maledicono lo sviluppatore per non usare un'opzione /TITLEo /Tinvece di impostare il titolo.
ADTC,

13

Ho combattuto con questo desiderio di evitare il prompt "Termina processo batch" per un po '.

La mia ultima epifania è un po 'un gioco di prestigio (o finestra della console), sostituendo un'istanza cmd.execon un'altra. Questo si ottiene eseguendo il comando / programma via start cmd /kseguita immediatamente da exitnel .BATfile.

La finestra della console originale scompare e quella di sostituzione può essere fermata in modo pulito tramite Ctrl- C.

Si consideri il seguente esempio di a tracerouteche può essere interrotto da Ctrl+ Co che può essere completato, restituendo l'utente al C:\>prompt:

@echo off

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

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

La sostituzione ambientale di un nuovo interprete di comandi potrebbe non essere per tutti, ma, ad occhio nudo, sembra e funziona bene per me.


+1 Un approccio molto nuovo e sebbene sia d'accordo che non sia un rimpiazzo esatto, funziona bene (anche se mi hai preoccupato quando hai iniziato il tuo post con "sostituzione di cmd.exe" - gli allarmi di sicurezza suonavano fino a quando non sono arrivato all'esempio e realizzato cosa intendevi)
Base

dovresti usare exit /bper uscire dallo script batch
Sebastian Godelet

1
@SebastianGodelet: questo è un buon consiglio in generale, ma qui l'intento è davvero quello di chiudere la finestra (originale) della console , dato che il comando target viene lanciato in una nuova finestra.
mklement0

Perché usare "cmd / k" (tenere aperto l'interprete) invece di "/ c"? Solo per poter vedere l'output del comando?
Raúl Salinas-Monteagudo il

9

La soluzione di Gringo è buona, ma non funziona bene con gli script che passano lungo l'elenco degli argomenti (cioè python myscript.py %*), poiché SHIFTnon si aggiorna %*. Esistono soluzioni alternative , ma presentano alcune limitazioni.

Ecco la modifica che ho finito con:

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

99. (9)% impeccabile.


Questo non funzionerà se myscript.pyvuole leggere da stdin.
jamesdlin,


0

Nel mio caso era il file ping.bat che si trovava proprio nella mia directory utente (C: \ Users \ in Vista o C: \ Documents and Settings \ in XP) che conteneva il lavoro batch in modo indeterminato.

Questo file batch veniva eseguito ogni volta che eseguivo il ping dal prompt dei comandi in cui la directory corrente è la mia directory utente. Il ping dalla finestra Esegui o dalla directory di altri utenti funzionava bene.

Rimosso il file dalla mia directory utente e il problema è stato risolto!


0

Inizia a funzionare, ma ora la finestra aperta dal file batch viene modificata dalle opzioni che avevo e le "proprietà" sono disabilitate (non risponderanno).


0

Basta reindirizzare lo stdin batch su null aggiungendo <nul alla fine del comando.


2
Penso che potresti aver significato <nul (dato che> nul invia tutto lo stdout a null).
Brian Phillips,

0

Mi sono imbattuto in questo con un EXE che sembrava lanciare ^ C al batch principale all'uscita, causando il prompt "Termina processo batch" anche su un'uscita pulita.

La soluzione che ho scelto di utilizzare era l'esecuzione del batch con "Start", simile ad altre risposte, ma da un prompt di PowerShell (o tramite il metodo dell'interprete PowerShell da CMD, se si sceglie).

È il 2018 ora e in Windows 10 Microsoft ha iniziato a soppiantare CMD con PowerShell come prompt dei comandi preferito, quindi è prontamente disponibile nella GUI, per impostazione predefinita.

Startè un alias per Start-Process .

Quando eseguito, si avvia e ritorna. Pertanto, quando si interrompe il processo avviato, non viene visualizzato il prompt "Termina processo batch".

Di default non aspetta, quindi non sono richiesti argomenti aggiuntivi oltre al comando e sono argomenti.

L'utilizzo start mything.exe -mythings -argumentsnel mio batch ha funzionato perfettamente.

In PowerShell gli script devono essere preceduti dal loro percorso per essere lanciati, quindi eseguo il mio file batch come .\host.bat.


0

TCC / LE , che è un sostituto gratuito di CMD (pensalo come CMD ++), ha un'opzione per sopprimere il prompt del lavoro batch terminato. È possibile trovare l'opzione nella finestra di dialogo Configurazione avvio TCC :

Annulla file batch su Ctrl-C : Annulla l'elaborazione di file batch senza il solito prompt quando premi Control-C.

Immagine dello schermo:

Opzioni TCC / LE

Se non hai mai sentito parlare di TCC / LE prima, ecco alcuni dettagli dal sito:

TCC / LE sostituisce la riga di comando CMD (il prompt dei comandi di Windows predefinito). TCC / LE è un superset di CMD, con 111 comandi interni (CMD ha meno di 40), 240 variabili e funzioni interne e centinaia di miglioramenti ai comandi CMD esistenti.

TCC / LE funziona con le applicazioni della riga di comando e i file batch esistenti, ma offre importanti miglioramenti nelle funzionalità della riga di comando e dei file batch e aggiunge migliaia di nuove funzionalità alle finestre del prompt dei comandi.

Ho usato TCC / LE per anni e 4 NT prima di esso. Ho molto amore per questo e posso consigliarlo. L'unico motivo per cui non lo uso ancora è perché uso quasi esclusivamente PowerShell ora.


0

Un motivo principale per sopprimere il "Termina processo batch (S / N)" è l'esecuzione di un programma in un ciclo (ad esempio: riesegui in caso di arresto anomalo).

Questo https://stackoverflow.com/a/8185270/1170023 ha contribuito a portare a questa soluzione:

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


-3

Alla fine dello script, basta aggiungere il seguente comando:
echo
Questo non "danneggerà" il comportamento dello script e sembra impedire a CDM di chiedere se si desidera terminare il batch.


5
Non ha funzionato per me.
Helgi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.