Come posso eseguire due comandi in una riga in Windows CMD?


Risposte:


1322

In questo modo su tutti i sistemi operativi Microsoft dal 2000, e ancora oggi buono:

dir & echo foo

Se si desidera eseguire il secondo comando solo se il primo è stato chiuso correttamente:

dir && echo foo

La sintassi singola e commerciale (&) per eseguire più comandi su una riga risale a Windows XP, Windows 2000 e alcune versioni precedenti di NT. (Almeno 4.0, secondo un commentatore qui.)

Ci sono molti altri punti su questo che troverai scorrere questa pagina.

Segue un dato storico per coloro che potrebbero trovarlo educativo.

Prima di ciò, la sintassi && era solo una caratteristica della sostituzione della shell 4DOS prima che quella funzione fosse aggiunta all'interprete dei comandi di Microsoft.

In Windows 95, 98 e ME, dovresti invece utilizzare il carattere pipe:

dir | echo foo

In MS-DOS 5.0 e versioni successive, tramite alcune versioni precedenti di Windows e NT dell'interprete dei comandi, il separatore di comandi (non documentato) era il carattere 20 (Ctrl + T) che rappresenterò con ^ T qui.

dir ^T echo foo

26
Almeno fino a NT 4.
Joey

17
Funziona anche su Win 8.0 e 8.1.
MEM

5
@Fallenreaper, funziona anche nel cmdprompt diretto , quindi suppongo che non sia una cattiva abitudine entrare. :)

6
@Fallenreaper Assicurati di essere consapevole della differenza pratica tra i due: vedi la risposta di Raihan di seguito.
Moshe Katz,

8
Capito A &&B, B verrà eseguito solo se A ha esito positivo, mentre A & B eseguirà B dopo A, indipendentemente dal risultato di A. Grazie per il testa a testa
Fallenreaper,

580

Una citazione dalla documentazione:

Utilizzo di più comandi e simboli di elaborazione condizionale

È possibile eseguire più comandi da una singola riga di comando o script utilizzando simboli di elaborazione condizionale. Quando si eseguono più comandi con simboli di elaborazione condizionale, i comandi a destra del simbolo di elaborazione condizionale agiscono in base ai risultati del comando a sinistra del simbolo di elaborazione condizionale.

Ad esempio, potresti voler eseguire un comando solo se il comando precedente ha esito negativo. In alternativa, potresti voler eseguire un comando solo se il comando precedente ha esito positivo.

È possibile utilizzare i caratteri speciali elencati nella tabella seguente per passare più comandi.

  • & [...]
    command1 & command2
    Utilizzare per separare più comandi su una riga comandi. Cmd.exe esegue il primo comando e quindi il secondo comando.

  • && [...]
    command1 && command2
    Utilizzare per eseguire il comando seguendo && solo se il comando che precede il simbolo ha esito positivo. Cmd.exe esegue il primo comando e quindi esegue il secondo comando solo se il primo comando è stato completato correttamente.

  • || [...]
    command1 || command2
    Utilizzare per eseguire il comando seguente || solo se il comando precedente || non riesce. Cmd.exe esegue il primo comando, quindi esegue il secondo comando solo se il primo comando non è stato completato correttamente (riceve un codice di errore maggiore di zero).

  • ( ) [...]
    (command1 & command2)
    Utilizzare per raggruppare o annidare più comandi.

  • ; or ,
    command1 parameter1;parameter2
    Utilizzare per separare i parametri di comando.


41
Prova cmd /c "echo foo & echo bar".
Raihan,

2
vagrant up && vagrant sshha funzionato senza virgolette su Windows 10.
furman87

Grazie! Non sapevo di Singe &- lo rende asincrono ed esegue entrambi in parallelo. Ero bloccato perché stavo usando &&con è sincrono e continua solo se il primo riesce!
TetraDev,

1
collegamento alla documentazione interrotto, nuova posizione technet.microsoft.com/en-us/library/bb490954.aspx
nkef,

7
@TetraDev &non rende i comandi asincroni o paralleli. command1 & command2verrà eseguito command2 dopo il command1 completamento. Il successo o il fallimento di command1è irrilevante.
bornfromanegg,

74

&è l'equivalente di Bash per ;(comandi di esecuzione) ed &&è l'equivalente di Bash di &&(comandi di esecuzione solo quando il precedente non ha causato un errore).


1
questo vale anche per csh, tcsh e molte altre shell. Non ho mai visto ;prima in Linux
phuclv

10
@ LưuVĩnhPhúc nelle shell in stile sh, ;significa eseguire il primo comando, attendere che finisca, quindi eseguire il secondo comando. &significa eseguire il primo comando, metterlo in background ed eseguire il secondo comando. Quindi entrambi i programmi si avviano contemporaneamente. Nota che questi non stanno combinando simboli, stanno trascinando simboli al primo comando; puoi lanciare un singolo comando in background progname &senza avere un secondo comando.
MM

25

Puoi usare & per eseguire i comandi uno dopo l'altro. Esempio:c:\dir & vim myFile.txt


19

Se si desidera creare un collegamento cmd (ad esempio sul desktop) aggiungere il parametro / k (/ k significa mantenere, / c chiuderà la finestra):

cmd /k echo hello && cd c:\ && cd Windows

16

È possibile utilizzare la chiamata per superare il problema delle variabili di ambiente che vengono valutate troppo presto - ad es

set A=Hello & call echo %A%

1
Funziona solo se la variabile non è già impostata, nel qual caso echostampa il vecchio valore, non il nuovo valore. Almeno, questo è ciò che osservo sulla mia scatola di Windows 7.
Craig M. Brandenburg,

Uso set A = prima per assicurarmi che la variabile non sia impostata.
SSi,

1
Un metodo migliore consiste nell'utilizzare l'espansione ritardata ( setlocal EnableDelayedExpansionin uno script o cmd /v). Ad esempio: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick,

5
Usa ^ dopo il primo percento per ottenere il nuovo valore: imposta A = Ciao e chiama echo% ^ A%
Nicolas

9

Un certo numero di simboli di elaborazione può essere utilizzato quando si eseguono più comandi sulla stessa riga e può portare all'elaborazione del reindirizzamento in alcuni casi, alla modifica dell'output in altri casi o al semplice fallimento. Un caso importante è posizionare sulla stessa riga comandi che manipolano le variabili.

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

Come si vede nell'esempio precedente, quando i comandi che utilizzano le variabili vengono posizionati sulla stessa riga, è necessario utilizzare l'espansione ritardata per aggiornare i valori delle variabili. Se la tua variabile è indicizzata, usa il comando CALL con i modificatori %% per aggiornare il suo valore sulla stessa riga:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5

dato esempio non ha funzionato per me, ma sotto uno ha fatto:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw

8

cmd /c ipconfig /all & Output.txt

Questo comando esegue il comando e apre il Output.txtfile in un singolo comando


8

Quindi, stavo cercando di abilitare l'attività specifica di esecuzione RegAsm(registro assemblaggio) da un menu di scelta rapida. Il problema che avevo era che il risultato sarebbe balenato e sarebbe andato via prima che potessi leggerlo. Quindi ho provato a eseguire il piping a Pause, che non funziona quando il comando fallisce (come menzionato qui il comando Pause non funziona nello script .bat e qui il comando del file batch PAUSE non funziona ). Quindi ho provato, cmd /kma questo lascia la finestra aperta per altri comandi (voglio solo leggere il risultato). Quindi ho aggiunto un pauseseguito exitalla catena, risultando nel seguente modo:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

Funziona come un incantesimo: RegAsm viene eseguito sul file e mostra i risultati, quindi viene visualizzato un prompt "Premere un tasto qualsiasi per continuare ...", quindi la finestra del prompt dei comandi si chiude quando viene premuto un tasto.

PS Per gli altri che potrebbero essere interessati, è possibile utilizzare le seguenti voci del file .reg per aggiungere un'associazione dllfile ai file .dll e quindi un'estensione del comando RegAsm (notare le virgolette e le barre rovesciate):

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"

Ora ho un bel menu di scelta rapida per registrare un assembly.



4

Per eseguire due comandi contemporaneamente, è necessario inserire un simbolo & (e commerciale) tra i due comandi. Così:

color 0a & start chrome.exe

Saluti!


4

Provo ad avere due ping nella stessa finestra, ed è un comando seriale sulla stessa riga. Dopo aver terminato il primo, eseguire il secondo comando.

La soluzione era combinare con start /bun prompt dei comandi di Windows 7.

Inizia come al solito, senza /b, e avvialo in una finestra separata.

Il comando utilizzato per l'avvio nella stessa riga è:

start /b command1 parameters & command2 parameters

In ogni caso, se si desidera analizzare l'output, non è consigliabile utilizzarlo. Ho notato che l'output è confuso tra l'output dei comandi.


4

Bene, hai due opzioni: Piping o semplicemente &:

DIR /S & START FILE.TXT

O,

tasklist | find "notepad.exe"

Piping ( |) è più per prendere l'output di un comando e metterlo in un altro. E ( &) sta solo dicendo di eseguire questo e quello.


Potresti modificare il tuo post per includere alcune spiegazioni su cosa fanno &e |cosa fanno e come differiscono, se non del tutto? In questo momento le persone che non hanno familiarità con questi concetti non sono in grado di decidere autonomamente quale dovrebbe essere usato nei loro casi.
Mirek Długosz,

Come ero. Colpa mia. Modificherò immediatamente il post. Apprezzalo.
PyDever,

Dovrebbe essere "findstr" anziché semplicemente "find"
Anu Shibin Joseph Raj,

2

No cd / && tree && echo %time%,. Il tempo echo è quando viene eseguito il primo comando.

Le tubazioni hanno qualche problema, ma non è fondamentale finché le persone sanno come funziona.


1

Un altro esempio: ad esempio, quando utilizziamo il gulpsistema di generazione, anziché

gulp - impostazione predefinita> build

gulp build - crea build-cartella

gulp watch - avvia file-watch

gulp dist - crea dist-folder

Possiamo farlo con una riga:

cd c:\xampp\htdocs\project & gulp & gulp watch

1

Quando provi a usare o manipolare le variabili in una riga, fai attenzione al loro contenuto! Ad esempio una variabile come la seguente

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

può portare a molti problemi irraggiungibili se lo usi come %PATH%

  1. Le parentesi di chiusura terminano la tua dichiarazione di gruppo
  2. Le doppie virgolette non consentono di utilizzare %PATH%per gestire il problema tra parentesi
  3. E cosa conterrà una variabile referenziata %USERPROFILE%?

2
Cosa c'entra questo con l'esecuzione di due comandi su una riga in Windows CMD?
Peter Mortensen,

1

Usa il &simbolo in Windows per usare il comando su una riga

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

come in Linux usiamo,

touch thisfile ; ls -lstrh


-2

È semplice: basta differenziarli con i &&segni. Esempio:

echo "Hello World" && echo "GoodBye World".

"Goodbye World" verrà stampato dopo "Hello World".


6
Indipendentemente dal fatto che ci sono già vecchie risposte che mostrano lo stesso, non è ancora del tutto corretto. &&è un operatore condizionale , il comando successivo viene eseguito solo quando il primo comando ha avuto esito positivo (errorlevel = 0)
jeb

ovviamente. è evidente se la persona vuole eseguire due comandi, quei due saranno corretti e quindi tutto andrà bene
Rajan Dhanowa,

1
Rajan: significa "il comando successivo viene eseguito solo se il primo comando ha esito positivo".
Ivan,

2
" Goodbye World verrà stampato dopo Hello World " purché la stampa Hello Worldnon abbia esito negativo. come ha detto @jeb, &&è condizionale. &esegue i comandi indipendentemente dal fatto che il precedente abbia avuto esito positivo o meno.
Pranav A.
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.