it-swarm-eu.dev

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

Voglio eseguire due comandi in una console CMD Windows.

In Linux lo farei così

touch thisfile ; ls -lstrh

Come è fatto su Windows?

740
flybywire

Come questo su tutti i SO 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. (4.0 almeno, secondo un commentatore qui.)

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

Seguono dati storici, per coloro che potrebbero trovarlo educativo.

In precedenza, la sintassi && era solo una funzionalità del 4DOS di sostituzione della shell prima che la funzione fosse aggiunta all'interprete dei comandi Microsoft.

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

dir | echo foo

In MS-DOS 5.0 e versioni successive, attraverso 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
1005
djdanlib

Una citazione dalla documentazione:

Utilizzo di più comandi e simboli di elaborazione condizionale

È possibile eseguire più comandi da una singola riga di comando o uno script utilizzando i 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, è possibile eseguire un comando solo se il comando precedente non riesce. Oppure, potresti voler eseguire un comando solo se il comando precedente ha avuto successo.

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

  • & [...]
    command1 & command2
    Utilizzare per separare più comandi su una riga di comando. 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 e 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 nidificare più comandi.

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

519
Raihan

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

65
manojlds

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

23
scrappedcola

Se vuoi creare un collegamento a cmd (ad esempio sul desktop) aggiungi il parametro/k (/ k significa keep,/c chiude la finestra):

cmd /k echo hello && cd c:\ && cd Windows
16
TroodoN-Mike

Puoi usare call per superare il problema delle variabili di ambiente che vengono valutate troppo presto - ad es.

set A=Hello & call echo %A%
11
SSi

Un numero di simboli di elaborazione può essere usato quando si eseguono diversi comandi sulla stessa linea, e può portare al reindirizzamento dell'elaborazione in alcuni casi, alterando l'output in altri casi o semplicemente fallendo. Un caso importante è mettere sulla stessa riga i 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 sono 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 linea:

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

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

Quindi, stavo cercando di abilitare l'attività specifica di eseguire RegAsm (register Assembly) da un menu di scelta rapida. Il problema che ho avuto è stato che il risultato si sarebbe rivelato e se ne sarebbe andato prima che potessi leggerlo. Così ho provato il piping con Pause, che non funziona quando il comando fallisce (come menzionato qui Il comando Pause non funziona nello script .bat e qui Il comando file batch PAUSE non funziona ). Così ho provato cmd /k ma questo lascia la finestra aperta per altri comandi (voglio solo leggere il risultato). Così ho aggiunto un pause seguito da exit alla catena, ottenendo il seguente risultato:

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 il messaggio "Premere un tasto qualsiasi per continuare ..." Viene visualizzato il prompt, quindi la finestra del prompt dei comandi si chiude quando viene premuto un tasto.

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

[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.

5
SNAFUBAR

cmd /c ipconfig /all & Output.txt

Questo comando esegue il comando e apre il file Output.txt in un unico comando

5
dpp.2325

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

color 0a & start chrome.exe

Saluti!

3
PryroTech

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

La soluzione era combinare con start /b su un prompt di comando di Windows 7.

Inizia come al solito, senza /b, e avvia 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 utilizzare questo . Ho notato che l'output è codificato tra l'output dei comandi.

3
sdcxp

Bene, hai due opzioni: Piping, o solo &:

DIR /S & START FILE.TXT

O,

tasklist | find "notepad.exe"

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

3
PyDever

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

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

1
notarealname

Quando cerchi di utilizzare o manipolare le variabili in una riga, fai attenzione ai loro contenuti! Per esempio. una variabile come la seguente

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

può portare a un sacco di guai sfortunati se lo usi come %PATH%

  1. Le parentesi di chiusura terminano la tua dichiarazione di gruppo
  2. Le virgolette non ti permettono di usare %PATH% per gestire il problema delle parentesi
  3. E cosa contiene una variabile di riferimento come %USERPROFILE%?
0
V15I0N

Un altro esempio: per esempio, quando usiamo il sistema di compilazione gulp, invece di

gulp - default> build

gulp build - build build-folder

gulp watch - avvia il file-watch

gulp dist - crea dist-folder

Possiamo farlo con una riga:

cd c:\xampp\htdocs\project & gulp & gulp watch
0
Mile Mijatovic

Si C'è. Suo &.

&& eseguirà il comando 2 quando il comando 1 è completo purché non abbia esito negativo.

e verrà eseguito indipendentemente.

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

echo Hello World && echo GoodBye World

Goodbye World verrà stampato dopo Hello World.

0
Rajan Dhanowa