2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

Come evitare che il prompt dei comandi si chiuda dopo l'esecuzione?

Il mio problema è che in Windows ci sono finestre a riga di comando che si chiudono immediatamente dopo l'esecuzione. Per risolvere questo problema, voglio che il comportamento predefinito sia quello di tenere aperta la finestra. Normalmente, questo comportamento può essere evitato con tre metodi che mi vengono in mente:

  1. 1. Mettere una riga pause dopo i programmi batch per chiedere all'utente di premere un tasto prima di uscire da
  2. 2. Esecuzione di questi file batch o di altri strumenti di manipolazione a riga di comando (anche l'avvio del servizio, il riavvio, ecc. con net start xy o qualcosa di simile) all'interno di cmd.exe(Start - Run - cmd.exe)
  3. Esecuzione di questi programmi con cmd /k in questo modo: cmd /k myprogram.bat

Ma ci sono alcuni altri casi in cui l'utente:

  1. Esegue il programma la prima volta e non sa che il programma dato verrà eseguito in Prompt di comando (Windows Command Processor) ad esempio quando si esegue una scorciatoia dal menu Start (o da qualche altra parte), OR
  2. Trova un po’ scomodo eseguire cmd.exe tutto il tempo e non ha il tempo/opportunità di riscrivere il codice di questi comandi ovunque per mettere una pausa dopo di loro o evitare di uscire esplicitamente.

Ho letto un articolo su come cambiare il comportamento predefinito di cmd.exe quando lo si apre esplicitamente, con la creazione di una voce AutoRun e manipolandone il contenuto in queste posizioni:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Gli articoli AutoRun sono _String values_…)

Ho messo cmd /d /k come valore di esso per provarlo, ma questo non ha affatto cambiato il comportamento delle cose sopra menzionate… Ha solo cambiato il comportamento della finestra della riga di comando quando la si apre esplicitamente (Start-Run-cmd.exe).

Allora come funziona? Può darmi qualche idea per risolvere questo problema?

Risposte (11)

18
18
18
2011-07-04 17:45:20 +0000

Citazione Microsoft :

Una console viene chiusa quando l'ultimo processo ad essa collegato termina o chiama FreeConsole.

In altre parole, la finestra della console Win32 sarà sempre chiusa quando l'ultimo programma in esecuzione al suo interno esce, e non è possibile modificarlo.


(Per i programmi MS-DOS a 16 bit, Windows offre un'opzione “Chiudi all'uscita” nella finestra delle proprietà, ma questa non è un'eccezione al comportamento di cui sopra: è il processo NTVDM che tiene aperta la finestra. Inoltre, questa opzione è di nuovo per programma).

8
8
8
2013-03-21 14:10:13 +0000

Basta aprire un prompt di comando nella posizione del vostro file batch, e digitare manualmente il nome del file batch per eseguirlo all'interno di quella finestra.

1.Navigare alla cartella dove risiede il vostro eseguibile 2.Maiuscolo-Destra cliccare e selezionare “Command Window from here” 3.digitare il nome dell'eseguibile e premere enter 4.Il processo dovrebbe essere eseguito, ma la finestra dovrebbe rimanere aperta

4
4
4
2012-11-06 13:37:01 +0000

cmd.exe /k vi darà problemi con qualche lotto. Se il batch exit 1 (senza /B) la vostra console sarà chiusa. Un trucco è usare:

cmd.exe /k cmd /c ...
``` &001 


Per usare questo per default per tutti i file batch, impostare `HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)` e `HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)` su **`"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*`**.
3
3
3
2014-04-26 16:55:23 +0000

Ho trovato una soluzione stupida dopo aver letto la risposta di grawity.

Il mio caso d'uso era la creazione di un ambiente di console al lavoro in cui tutte le soluzioni più ragionevoli sono bloccate. Tutto quello che mi serve è impostare PATH e configurare alcuni alias doskey ed essere scaricato nella shell.

La mia soluzione (appena testata su Win7) come add cmd come ultima riga del file batch. Questo esegue un prompt di comando annidato che eredita l'ambiente del suo genitore. Quella shell figlio tiene aperto il processo di batch fino a quando non si esce, a quel punto il batch non ha più processi figlio ed esce anch'esso.

2
2
2
2015-12-11 17:02:56 +0000

Si supponga di avere due file batch che si vogliono lanciare nel loro caso e che si vogliono tenere aperti se il loro eseguibile esce. Chiamiamo questi due lotti A.bat e B.bat.

Ora per semplicità si potrebbe avere un file batch per lanciarli entrambi, chiamiamolo launch_both.bat con il contenuto:

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

Potrebbe non funzionare come previsto se si chiama exit in uno dei due file batch. Questo dovrà essere testato.

2
2
2
2013-03-21 20:02:36 +0000

Invece di usare PAUSA (preferisco SCELTA o TIMEOUT all'uso di PAUSA quando necessario), potete usare la soluzione qui: 886848/come fare-windows-batch-file-pausa quando si fa doppio clic .

In questo modo, se si fa clic su un file batch o su un link (scorciatoia) dall'interno di Windows Explorer, è possibile far mettere in pausa il programma del file batch prima che esca, in modo da poter visualizzare l'output del programma ed eventuali messaggi di errore.

Usando CHOICE, si può programmare la possibilità per l'utente di selezionare una varietà di azioni da intraprendere, e usando TIMEOUT si può lasciare che la finestra si chiuda dopo un ritardo di tempo (incustodito). Se si esegue il file batch da una finestra del prompt dei comandi, queste pause possono essere fastidiose.

La soluzione collegata consente di decidere se si desidera saltare le pause se il file batch è stato eseguito da una finestra del prompt dei comandi.

Si può leggere di più al link fornito, ma la base di esso è che utilizza la variabile d'ambiente:

%cmdcmdline%

per determinare se il file batch è stato eseguito da una finestra di prompt dei comandi o meno.

Quindi, lo si usa così:

Al punto in cui il file batch uscirà, si aggiunge un codice come questo:

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt
1
1
1
2013-03-12 15:30:15 +0000

Il modo migliore che ho trovato per aggirare questo problema è quello di chiamare i vostri file batch da un altro file batch usando start.

quindi se normalmente si esegue un file chiamato go.bat, allora si creerebbe un secondo file batch chiamato qualcosa come go2.bat

il contenuto di go2.bat sarebbe solo

start go.bat

la prima finestra si chiude immediatamente, ma quella che esegue il vostro go.bat rimane aperta

1
1
1
2013-09-24 12:30:12 +0000

Questo funziona per la versione 5.00 dell'Editor del Registro di sistema di Windows.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"
``` &001 


Salva i cmds di cui sopra in un file chiamato qualcosa come `cmdbatfile-open.reg` ed eseguilo!
0
0
0
2017-03-30 08:30:11 +0000

Per gli utenti che utilizzano Windows 10, si noti che nessuna delle risposte di cui sopra funziona attualmente per Windows 10.

Per Windows 10, se si ha accesso allo script, è necessario aggiungere il seguente codice alla fine:

read

Tale codice attende un'immissione prima di chiudere.

0
0
0
2019-12-31 21:58:53 +0000

La domanda dell'OP è molto più coinvolgente di quello che mi serviva, e quindi questa risposta è per altri che vengono qui a cercare un modo semplice per lanciare un programma a riga di comando e tenere aperta la finestra dopo l'uscita del programma a riga di comando.

Nel mio caso, volevo eseguire NodeJS e tenere aperta la finestra della console dopo che NodeJS si è fermato. Ecco la mia soluzione:

File: RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

Ho poi creato un collegamento a quel file sul mio desktop e ho fatto doppio clic sul collegamento per lanciare una console cmd.exe che esegue il comando del nodo e rimane aperta dopo l'uscita di esso (il comando del nodo).

Ho usato cmd.exe /k cmd /c node a causa di un'altra risposta data qui.

0
0
0
2017-06-30 03:30:27 +0000

In risposta al declassamento di PSIXO - “Questa risposta era già presente nella domanda. - Ro Yo Mi Jan 20 ‘16 alle 5:06” – NO, NON lo era. Le risposte precedenti erano: “pausa”, che NON ha funzionato. La risposta di PSIXO era: “& pausa”, che funziona. Si prega di analizzare più attentamente prima di declassare. Ho eseguito questo da un prompt IDLE, e ha funzionato:

>>> os.system('dir ^ & pause')
    0
    >>>
``` ```
>>> os.system('dir ^ pause')
    1
    >>>

D'altra parte:

&001

NON ha funzionato (il prompt cmd si è ribaltato, e di fatto ha restituito un errore (1)). Grazie a PSIXO per la risposta che mi serviva. Henry.