Comment exécuter deux commandes sur une seule ligne dans Windows CMD?

962

Je veux exécuter deux commandes dans une console Windows CMD.

Sous Linux, je le ferais comme ça

touch thisfile ; ls -lstrh

Comment ça se passe sous Windows?

fil volant
la source

Réponses:

1322

Comme cela sur tous les systèmes d'exploitation Microsoft depuis 2000, et toujours bon aujourd'hui:

dir & echo foo

Si vous souhaitez que la deuxième commande s'exécute uniquement si la première s'est terminée avec succès:

dir && echo foo

La syntaxe esperluette unique (&) pour exécuter plusieurs commandes sur une seule ligne remonte à Windows XP, Windows 2000 et certaines versions antérieures de NT. (4.0 au moins, selon un commentateur ici.)

Il y a pas mal d'autres points à ce sujet que vous trouverez en faisant défiler cette page.

Des données historiques suivent, pour ceux qui peuvent trouver cela éducatif.

Avant cela, la syntaxe && n'était qu'une fonctionnalité du remplacement de shell 4DOS avant que cette fonctionnalité ne soit ajoutée à l'interpréteur de commandes Microsoft.

Dans Windows 95, 98 et ME, vous utiliseriez le caractère de canal à la place:

dir | echo foo

Dans MS-DOS 5.0 et versions ultérieures, via certaines versions antérieures de Windows et NT de l'interpréteur de commandes, le séparateur de commandes (non documenté) était le caractère 20 (Ctrl + T) que je représenterai avec ^ T ici.

dir ^T echo foo
djdanlib
la source
26
Au moins jusqu'à NT 4.
Joey
17
Fonctionne également sur Win 8.0 et 8.1.
MEMark
5
@Fallenreaper, cela fonctionne également dans l' cmdinvite directe , donc je suppose que ce n'est pas une mauvaise habitude. :)
6
@Fallenreaper Assurez-vous que vous êtes conscient de la différence pratique entre les deux: voir la réponse de Raihan ci-dessous.
Moshe Katz
8
Vous avez. A && B, B ne fonctionneront que si A réussit, tandis que A & B exécutera B après A, quel que soit le résultat de A. Merci pour l'
avertissement
580

Une citation de la documentation:

Utilisation de plusieurs commandes et symboles de traitement conditionnel

Vous pouvez exécuter plusieurs commandes à partir d'une seule ligne de commande ou d'un seul script à l'aide de symboles de traitement conditionnel. Lorsque vous exécutez plusieurs commandes avec des symboles de traitement conditionnel, les commandes à droite du symbole de traitement conditionnel agissent en fonction des résultats de la commande à gauche du symbole de traitement conditionnel.

Par exemple, vous souhaiterez peut-être exécuter une commande uniquement si la commande précédente échoue. Ou, vous souhaiterez peut-être exécuter une commande uniquement si la commande précédente a réussi.

Vous pouvez utiliser les caractères spéciaux répertoriés dans le tableau suivant pour passer plusieurs commandes.

  • & [...]
    command1 & command2
    Utilisez pour séparer plusieurs commandes sur une seule ligne de commande. Cmd.exe exécute la première commande, puis la deuxième commande.

  • && [...]
    command1 && command2
    Utilisez pour exécuter la commande suivant && uniquement si la commande précédant le symbole a réussi. Cmd.exe exécute la première commande, puis exécute la deuxième commande uniquement si la première commande s'est terminée avec succès.

  • || [...]
    command1 || command2
    Utilisez pour exécuter la commande suivante || uniquement si la commande précédant || échoue. Cmd.exe exécute la première commande, puis exécute la deuxième commande uniquement si la première commande ne s'est pas terminée correctement (reçoit un code d'erreur supérieur à zéro).

  • ( ) [...]
    (command1 & command2)
    Utilisez pour regrouper ou imbriquer plusieurs commandes.

  • ; or ,
    command1 parameter1;parameter2
    Utilisez pour séparer les paramètres de commande.

Raihan
la source
41
Essayez cmd /c "echo foo & echo bar".
Raihan
2
vagrant up && vagrant sshtravaillé sans guillemets sur Windows 10.
furman87
Merci! Je ne connaissais pas singe &- le rend asynchrone et l'exécute en parallèle. J'étais coincé parce que j'utilisais &&avec est synchrone et ne continue que si le premier réussit!
TetraDev
1
lien de documentation rompu, nouvel emplacement technet.microsoft.com/en-us/library/bb490954.aspx
nkef
7
@TetraDev &ne rend pas les commandes asynchrones ou parallèles. command1 & command2s'exécutera une command2 fois command1 terminé. Le succès ou l'échec de command1n'est pas pertinent.
bornfromanegg
74

&est l'équivalent Bash de ;(exécuter les commandes) et &&l'équivalent Bash de &&(exécuter les commandes uniquement lorsque la précédente n'a pas provoqué d'erreur).

manojlds
la source
1
cela est également vrai pour csh, tcsh et bien d'autres shells. Je n'ai jamais vu ;auparavant sous Linux
phuclv
10
@ LưuVĩnhPhúc dans des shells de style sh, ;signifie exécuter la première commande, attendre qu'elle se termine, puis exécuter la deuxième commande. &signifie exécuter la première commande, la mettre en arrière-plan et exécuter la deuxième commande. Les deux programmes se lancent donc simultanément. Notez que ce ne sont pas des symboles de combinaison, ce sont des symboles de fin à la première commande; vous pouvez lancer une seule commande en arrière-plan progname &sans avoir de seconde commande.
MM
25

Vous pouvez utiliser & pour exécuter les commandes l'une après l'autre. Exemple:c:\dir & vim myFile.txt

scrappedcola
la source
19

Si vous souhaitez créer un raccourci cmd (par exemple sur votre bureau) ajoutez le paramètre / k (/ k signifie garder, / c fermera la fenêtre):

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

Vous pouvez utiliser l' appel pour surmonter le problème des variables d'environnement évaluées trop tôt - par exemple

set A=Hello & call echo %A%
SSi
la source
1
Cela ne fonctionne que si la variable n'est pas déjà définie, auquel cas la echoimprime l' ancienne valeur, pas la nouvelle valeur. C'est du moins ce que j'observe sur ma box Windows 7.
Craig M. Brandenburg
J'utilise set A = first pour m'assurer que la variable n'est pas définie.
SSi
1
Une meilleure méthode consiste à utiliser l'expansion retardée ( setlocal EnableDelayedExpansiondans un script ou cmd /v). Par exemple: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
5
Utilisez ^ après le premier pour cent pour obtenir la nouvelle valeur: définissez A = Bonjour & appelez echo% ^ A%
Nicolas
9

Un certain nombre de symboles de traitement peuvent être utilisés lors de l'exécution de plusieurs commandes sur la même ligne, et peuvent entraîner un redirection de traitement dans certains cas, une modification de la sortie dans d'autres cas, ou tout simplement échouer. Un cas important est de placer sur la même ligne des commandes qui manipulent des variables.

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

0 1

Comme vous le voyez dans l'exemple ci-dessus, lorsque des commandes utilisant des variables sont placées sur la même ligne, vous devez utiliser une expansion retardée pour mettre à jour vos valeurs de variable. Si votre variable est indexée, utilisez la commande CALL avec les modificateurs %% pour mettre à jour sa valeur sur la même ligne:

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

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
la source
l'exemple donné n'a pas fonctionné pour moi mais en dessous un a fonctionné: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

Cette commande exécute la commande et ouvre le Output.txtfichier en une seule commande

dpp.2325
la source
8

Donc, j'essayais d'activer la tâche spécifique de l'exécution RegAsm(assemblage de registres) à partir d'un menu contextuel. Le problème que j'avais était que le résultat se mettait à clignoter et disparaissait avant que je puisse le lire. J'ai donc essayé la tuyauterie vers Pause, qui ne fonctionne pas lorsque la commande échoue (comme mentionné ici, la commande Pause ne fonctionne pas dans le script .bat et ici la commande PAUSE du fichier batch ne fonctionne pas ). J'ai donc essayé cmd /kmais cela laisse la fenêtre ouverte pour plus de commandes (je veux juste lire le résultat). J'ai donc ajouté un pausesuivi par exità la chaîne, ce qui donne les résultats suivants:

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

Cela fonctionne comme un charme - RegAsm s'exécute sur le fichier et affiche ses résultats, puis une invite "Appuyez sur n'importe quelle touche pour continuer ..." s'affiche, puis la fenêtre d'invite de commande se ferme lorsqu'une touche est enfoncée.

PS Pour ceux qui pourraient être intéressés, vous pouvez utiliser les entrées de fichier .reg suivantes pour ajouter une association dllfile aux fichiers .dll, puis une extension de commande RegAsm à celle-ci (notez les guillemets et les barres obliques inversées échappés):

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

J'ai maintenant un joli menu contextuel pour enregistrer un assemblage.

SNAFUBAR
la source
4

Pour exécuter deux commandes en même temps, vous devez mettre un symbole & (esperluette) entre les deux commandes. Ainsi:

color 0a & start chrome.exe

À votre santé!

PryroTech
la source
4

J'essaie d'avoir deux pings dans la même fenêtre, et c'est une commande série sur la même ligne. Après avoir terminé la première, exécutez la deuxième commande.

La solution était de combiner avec start /bsur une invite de commande Windows 7.

Commencez comme d'habitude, sans /bet lancez dans une fenêtre séparée.

La commande utilisée pour lancer sur la même ligne est:

start /b command1 parameters & command2 parameters

De toute façon, si vous souhaitez analyser la sortie, je ne recommande pas d'utiliser cela. J'ai remarqué que la sortie est brouillée entre la sortie des commandes.

sdcxp
la source
4

Eh bien, vous avez deux options: la tuyauterie, ou tout simplement &:

DIR /S & START FILE.TXT

Ou,

tasklist | find "notepad.exe"

Piping ( |) est plus pour prendre la sortie d'une commande et la mettre dans une autre. Et ( &) dit simplement exécuter ceci et cela.

PyDever
la source
Pourriez-vous modifier votre message pour inclure une explication sur ce qui fait &et |fait et comment ils diffèrent, le cas échéant? À l'heure actuelle, les personnes qui ne connaissent pas ces concepts ne sont pas en mesure de décider par elles-mêmes laquelle utiliser dans leur cas.
Mirek Długosz
Comme j'étais. Ma faute. Je modifierai le message immédiatement. Je l'apprécie.
PyDever
Devrait être "findstr" au lieu de simplement "trouver"
Anu Shibin Joseph Raj
2

Non cd / && tree && echo %time%. L'heure en écho est celle à laquelle la première commande est exécutée.

La tuyauterie a un problème, mais ce n'est pas critique tant que les gens savent comment cela fonctionne.

notarealname
la source
1

Un autre exemple: par exemple, lorsque nous utilisons le gulpsystème de génération, au lieu de

gulp - par défaut> build

gulp build - build build-folder

gulp watch - démarrer la surveillance des fichiers

gulp dist - construire un dossier dist

Nous pouvons le faire avec une seule ligne:

cd c:\xampp\htdocs\project & gulp & gulp watch
Mile Mijatović
la source
1

Lorsque vous essayez d'utiliser ou de manipuler des variables sur une seule ligne, méfiez-vous de leur contenu! Par exemple, une variable comme la suivante

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

peut entraîner de nombreux problèmes non gérables si vous l'utilisez comme %PATH%

  1. Les parenthèses fermantes terminent votre instruction de groupe
  2. Les guillemets doubles ne vous permettent pas d'utiliser %PATH%pour gérer le problème des parenthèses
  3. Et que contiendra une variable référencée comme %USERPROFILE%?
V15I0N
la source
2
Qu'est-ce que cela a à voir avec l'exécution de deux commandes sur une seule ligne dans Windows CMD?
Peter Mortensen
1

Utiliser le &symbole dans les fenêtres pour utiliser la commande sur une seule ligne

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

comme sous linux que nous utilisons,

touch thisfile ; ls -lstrh
Arshdeep Kharbanda
la source
0

Oui il y a. Ça l'est &.

&& exécutera la commande 2 lorsque la commande 1 est terminée à condition qu'elle n'ait pas échoué.

& s'exécutera malgré tout.

هادی کشاورز Hadi Keshavarz
la source
-2

C'est simple: il suffit de les différencier par des &&signes. Exemple:

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

"Goodbye World" sera imprimé après "Hello World".

Rajan Dhanowa
la source
6
Indépendamment du fait, qu'il existe déjà des réponses anciennes qui montrent la même chose, ce n'est toujours pas tout à fait correct. &&est un opérateur conditionnel , la commande suivante n'est exécutée que lorsque la première commande a réussi (errorlevel = 0)
jeb
bien sûr. il va de soi si la personne veut exécuter deux commandes, ces deux seront correctes et donc tout ira bien
Rajan Dhanowa
1
Rajan: il signifie "la prochaine commande n'est exécutée que si la première commande réussit".
Ivan
2
" Goodbye World sera imprimé après Hello World " à condition que l'impression Hello Worldn'ait pas échoué. comme l'a dit @jeb, &&est conditionnel. &exécute des commandes, que la précédente ait réussi ou non.
Pranav A.