web-dev-qa-db-fra.com

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

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

Sous Linux je le ferais comme ça

touch thisfile ; ls -lstrh

Comment fait-on Windows?

740
flybywire

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

dir & echo foo

Si vous voulez que la deuxième commande ne soit exécutée que si la première est sortie avec succès:

dir && echo foo

La syntaxe simple esperluette (&) permettant d'exécuter plusieurs commandes sur une ligne revient à Windows XP, Windows 2000 et à certaines versions antérieures de NT. (4.0 au moins, selon un intervenant ici.)

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

Les données historiques suivent, pour ceux qui peuvent le trouver éducatif.

Auparavant, la syntaxe && n'était qu'une fonctionnalité du 4DOS de remplacement de Shell avant son ajout à l'interpréteur de commandes Microsoft.

Sous Windows 95, 98 et ME, vous utiliseriez plutôt le caractère de canal:

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 vais représenter avec ^ T ici.

dir ^T echo foo
1005
djdanlib

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 situées à droite du symbole de traitement conditionnel agissent en fonction des résultats de la commande située à gauche du symbole de traitement conditionnel. 

Par exemple, vous pouvez exécuter une commande uniquement si la commande précédente échoue. Vous pouvez également exécuter une commande uniquement si la commande précédente a abouti.

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

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

  • && [...]
    command1 && command2
    Utilisez pour exécuter la commande suivant && uniquement si la commande précédant le symbole est réussie. Cmd.exe exécute la première commande, puis n'exécute la deuxième commande que si la première commande a abouti. 

  • || [...]
    command1 || command2
    Utilisez pour exécuter la commande après || seulement si la commande précédant || échoue. Cmd.exe exécute la première commande, puis la seconde seulement si la première commande n'a pas abouti (reçoit un code d'erreur supérieur à zéro).

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

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

519
Raihan

& est l'équivalent de Bash pour ; (commandes d'exécution) et && est l'équivalent de Bash de && (commandes d'exécution uniquement lorsque les précédentes n'ont pas provoqué d'erreur).

65
manojlds

Vous pouvez utiliser & pour exécuter les commandes les unes après les autres. Exemple: c:\dir & vim myFile.txt

23
scrappedcola

Si vous voulez 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
16
TroodoN-Mike

Vous pouvez utiliser call pour résoudre le problème des variables d’environnement évaluées trop tôt - par ex.

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

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 une redirection de traitement dans certains cas, une modification de la sortie dans d'autres cas, ou tout simplement un échec. Un cas important est de placer sur la même ligne des commandes manipulant 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 un développement retardé pour mettre à jour les valeurs de vos variables. 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
6
sambul35

J'essayais donc d'activer la tâche spécifique consistant à exécuter RegAsm (register Assembly) à partir d'un menu contextuel. Le problème que j'avais était que le résultat clignoterait et disparaîtrait avant que je puisse le lire. J'ai donc essayé de canaliser Pause, ce qui ne fonctionne pas lorsque la commande échoue (comme mentionné ici La commande de pause ne fonctionne pas dans le script .bat et ici La commande de fichier batch PAUSE ne fonctionne pas ). J'ai donc essayé cmd /k mais cela laisse la fenêtre ouverte pour plus de commandes (je veux juste lire le résultat). J'ai donc ajouté une pause suivie de exit à la chaîne, ce qui donne:

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 l'invite "Appuyez sur n'importe quelle touche pour continuer ..." s'affiche, puis la fenêtre Invite de commandes se ferme lorsque vous appuyez sur une touche.

P.S. Pour les autres personnes intéressées, vous pouvez utiliser les entrées de fichier .reg suivantes pour ajouter une association de fichier DLL aux fichiers .dll, puis une extension de commande RegAsm à celle-ci (remarquez les guillemets et les barres obliques inversées):

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

Maintenant, j'ai un joli menu contextuel pour enregistrer une assemblée.

5
SNAFUBAR

cmd /c ipconfig /all & Output.txt

Cette commande exécute commande et ouvre le fichier Output.txt en une seule commande

5
dpp.2325

Pour exécuter deux commandes simultanément, vous devez insérer un symbole & (esperluette) entre les deux commandes. Ainsi:

color 0a & start chrome.exe

À votre santé!

3
PryroTech

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é le premier, exécutez la deuxième commande.

La solution consistait à combiner avec start /b sur une invite de commande Windows 7.

Commencez comme d'habitude, sans /b, et lancez-le dans une fenêtre séparée.

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

start /b command1 parameters & command2 parameters

Quoi qu'il en soit, si vous souhaitez analyser la sortie, je ne recommande pas d'utiliser ceci ..__ J'ai remarqué que la sortie est brouillée entre la sortie des commandes.

3
sdcxp

Eh bien, vous avez deux options: Tuyauterie ou simplement &:

DIR /S & START FILE.TXT

Ou,

tasklist | find "notepad.exe"

Piping (|) est plus utile pour prendre le résultat d’une commande et le mettre dans une autre. Et (&) dit simplement exécuter ceci et cela. 

3
PyDever

Non, cd / && tree && echo %time%. Le temps indiqué est celui de l'exécution de la première commande.

La tuyauterie a quelques problèmes, mais ce n’est pas critique tant que les gens savent comment cela fonctionne.

1
notarealname

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 celle-ci

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

peut causer beaucoup de problèmes inutilisables si vous l’utilisez en tant que %PATH%

  1. Les parenthèses fermantes terminent votre déclaration de groupe
  2. Les guillemets doubles ne vous permettent pas d'utiliser %PATH% pour traiter le problème des parenthèses
  3. Et que va contenir une variable référencée comme %USERPROFILE%?
0
V15I0N

Un autre exemple: par exemple, lorsque nous utilisons le système de construction gulp au lieu de

gulp - default> build

gulp build - build-folder

gulp watch - lance la surveillance du fichier

gulp dist - construire le dossier dist

Nous pouvons le faire avec une seule ligne:

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

Oui il y a. C'est &.

&& exécutera la commande 2 à la fin de la commande 1, à condition qu'elle n'ait pas échoué.

& exécutera quand même.

C'est simple: juste les différencier avec des signes &&. Exemple: 

echo Hello World && echo GoodBye World

Goodbye World sera imprimé après Hello World.

0
Rajan Dhanowa