it-swarm-eu.dev

Vieni sopprimere la risposta "Termina processo batch (S/N)"?

In cmd, quando premiamo Ctrl + C, l'applicazione di destinazione viene terminata, ma se l'applicazione di destinazione viene chiamata da un file batch, otteniamo la conferma "Termina processo batch (S/N)". Non riesco mai a ricordare un'istanza in cui ho scelto di non terminare il lavoro in batch. Come possiamo saltare questa conferma?

146
Srikanth

AFAIK non è possibile poiché questo comportamento è di progettazione e controllato dall'interprete dei comandi. Non esiste un metodo per "mappare" o addirittura "intercettare" questo a meno che non si decompuli e ricompili direttamente l'interprete.

47
BinaryMisfit

Stampa Ctrl+C due volte.

57

In questo site , ho trovato una soluzione efficace:

script2.cmd < nul

Per non doverlo digitare ogni volta che ho creato un secondo script chiamato script.cmd nella stessa cartella con la riga sopra. Ho provato questa tecnica solo su XP, ma altri lo hanno confermato su Win 7.

Nathan aggiunge: un'altra opzione è 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
)
54
Gringo Suave

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

Quindi "funziona" con qualsiasi finestra di cmd.exe. Non è necessario modificare ciò che è in esecuzione o in altro modo, dal momento che clink piggy-back su cmd.exe.

Frickin 'fantastico, IMO!

26
Macke

Se non è necessario fare nulla nel file batch dopo che l'applicazione ha terminato normalmente, quindi utilizzare il comando start garantisce che il file batch sia già finito quando si preme Ctrl-C. E quindi il messaggio non apparirà.

Per esempio:

@echo off 
 
 set my_command = ping.exe 
 set 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 allora questo creerà una nuova finestra, mentre 
 :: esecuzione di questo il file batch continuerà nella finestra corrente: 
 
 start% my_command%% my_params% 
 
 echo. 
 echo Questa riga verrà eseguita PRIMA 'start' è persino finito. Quindi, questo file 
 Echo batch verrà completato PRIMA di premere Ctrl-C nell'altra finestra. 
 Echo. 
 
 :: Solo per i test usare 'pause' per mostrare "Premi qualsiasi tasto per continuare", per vedere 
 :: l'output dei comandi "echo". Assicurati di premere Ctrl-C nella finestra 
 :: che esegue il comando 'ping' (non in questa finestra). O semplicemente rimuovere 
 :: la riga successiva quando confuso: 
 
 Pausa 

(Testato su Windows XP.)

17
sgmoore

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

La mia ultima epifania è un po 'un gioco di prestigio (o una finestra della console), sostituendo un'istanza di cmd.exe con un'altra. Questo si ottiene eseguendo il comando/programma tramite start cmd /k seguito immediatamente da exit nel file .BAT.

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

Considera il seguente esempio di traceroute che può essere interrotto da Ctrl+C, o permesso di completare, restituendo l'utente al prompt C:\>:

@echo off

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

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

La sostituzione dell'ambiente di un nuovo interprete di comandi potrebbe non essere per tutti, ma, a occhio nudo, sembra e funziona bene per me.

13
ViperGeek

La soluzione di Gringo è buona, ma non funziona bene con gli script che passano lungo la lista degli argomenti (cioè python myscript.py %*), poiché SHIFT non aggiorna %*. Ci sono soluzioni alternative , ma hanno alcune limitazioni.

Ecco la modifica ho finito con:

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

99. (9)% impeccabile.

7
Olegs Jeremejevs

Vedi questa domanda sull'overflow dello stack .

Tuttavia, patching cmd.exe non è qualcosa che vorrei fare per quello.

4
Joey

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

0
user31480

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

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

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

Start è un alias per Start-Process .

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

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

L'utilizzo di start mything.exe -mythings -arguments nel mio batch ha funzionato perfettamente.

Negli script di PowerShell deve essere preceduto dal loro percorso da avviare, quindi eseguo il mio file batch come .\Host.bat.

0

Un motivo fondamentale per sopprimere il "Termina il lavoro batch (S/N)", è quello di eseguire un programma in un ciclo (ad esempio: ri-eseguire nel caso in cui si blocca).

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
)
0
kevinf

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

0
Il Cognato

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

Questo file batch è stato eseguito ogni volta che eseguivo il ping dal comando Prompt dove la directory corrente è la mia directory utente. Il ping dalla finestra Esegui o dalla directory di altri utenti stava funzionando bene.

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

0
bonipet

TCC/LE , che è una sostituzione CMD gratuita (si pensi a CMD ++), ha un'opzione per sopprimere il job batch terminato. Puoi trovare l'opzione nel TCC Startup Configuration Dialog :

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

Immagine dello schermo:

 TCC/LE options

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

TCC/LE è un sostituto per la riga di comando CMD (il comando predefinito di Windows Prompt). 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 tue attuali applicazioni da riga di comando e file batch, ma offre importanti miglioramenti nelle funzionalità di riga di comando e file batch e aggiunge migliaia di nuove funzionalità al tuo prompt.

Ho usato TCC/LE per anni e 4NT prima di esso. Ho molto amore per questo e posso raccomandarlo. L'unica ragione per cui non lo uso ancora è che utilizzo quasi esclusivamente PowerShell ora.

0
Charles Roper