Voglio eseguire due comandi in una console CMD di Windows.
In Linux lo farei così
touch thisfile ; ls -lstrh
Come si fa su Windows?
Voglio eseguire due comandi in una console CMD di Windows.
In Linux lo farei così
touch thisfile ; ls -lstrh
Come si fa su Windows?
Risposte:
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
cmd
prompt diretto , quindi suppongo che non sia una cattiva abitudine entrare. :)
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.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
ha funzionato senza virgolette su Windows 10.
&
- lo rende asincrono ed esegue entrambi in parallelo. Ero bloccato perché stavo usando &&
con è sincrono e continua solo se il primo riesce!
&
non rende i comandi asincroni o paralleli. command1 & command2
verrà eseguito command2
dopo il command1
completamento. Il successo o il fallimento di command1
è irrilevante.
&
è 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).
;
prima in Linux
;
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.
Puoi usare & per eseguire i comandi uno dopo l'altro. Esempio:c:\dir & vim myFile.txt
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
È 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%
echo
stampa il vecchio valore, non il nuovo valore. Almeno, questo è ciò che osservo sulla mia scatola di Windows 7.
setlocal EnableDelayedExpansion
in uno script o cmd /v
). Ad esempio: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
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
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
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 /k
ma questo lascia la finestra aperta per altri comandi (voglio solo leggere il risultato). Quindi ho aggiunto un pause
seguito exit
alla 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.
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 /b
un 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.
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.
&
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.
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.
Un altro esempio: ad esempio, quando utilizziamo il gulp
sistema 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
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%
%PATH%
per gestire il problema tra parentesi%USERPROFILE%
?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
Si C'è. Lo è &
.
&&
eseguirà il comando 2 al termine del comando 1 purché non abbia esito negativo.
&
verrà eseguito indipendentemente.
È semplice: basta differenziarli con i &&
segni. Esempio:
echo "Hello World" && echo "GoodBye World".
"Goodbye World" verrà stampato dopo "Hello World".
&&
è un operatore condizionale , il comando successivo viene eseguito solo quando il primo comando ha avuto esito positivo (errorlevel = 0)
Hello World
non abbia esito negativo. come ha detto @jeb, &&
è condizionale. &
esegue i comandi indipendentemente dal fatto che il precedente abbia avuto esito positivo o meno.