Question Comment exécuter deux commandes dans 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 cela se fait-il sous Windows?


641
2017-11-08 18:31


origine


Réponses:


Comme ça sur tous les systèmes d'exploitation Microsoft depuis 2000, et encore bien aujourd'hui:

dir & echo foo

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

dir && echo foo

La syntaxe à simple esperluette (&) pour 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 commentateur ici.)

Il y a quelques autres points à ce sujet que vous trouverez en bas de cette page.

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

Avant cela, la syntaxe && était seulement une caractéristique du shell 4DOS de remplacement avant que cette fonctionnalité ait été ajoutée à l'interpréteur de commandes Microsoft.

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

dir | echo foo

Dans MS-DOS 5.0 et versions ultérieures, à travers 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

841
2017-11-08 18:33



Une citation de la documentation:

Utilisation de plusieurs commandes et de 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 est réussie.

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

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

  • && [...]
    command1 && command2
      Utilisez pour exécuter la commande après && 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 a réussi.

  • || [...]
    command1 || command2
      Utilisez pour exécuter la commande suivant || seulement 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 n'a pas réussi (reçoit un code d'erreur supérieur à zéro).

  • ( ) [...]
    (command1 & command2)
      Permet de grouper ou d'imbriquer plusieurs commandes.

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


490
2017-11-08 18:36



& est l'équivalent de Bash pour ; (exécuter des commandes) et && est l'équivalent de Bash de && (exécutez les commandes uniquement lorsque le précédent n'a pas causé d'erreur).


63
2017-11-08 18:37



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


23
2017-11-08 18:34



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
2017-11-12 06:39



Vous pouvez utiliser appel pour surmonter le problème de l'évaluation des variables d'environnement trop tôt - par ex.

set A=Hello & call echo %A%

11
2018-03-13 11:06



cmd /c ipconfig /all & Output.txt

Cette commande exécute la commande et ouvre Output.txt fichier dans une seule commande


5
2018-04-16 05:41



Donc, j'essayais d'activer la tâche spécifique de courir RegAsm (enregistrer l'assemblage) à partir d'un menu contextuel. Le problème que j'avais était que le résultat allait flamber et disparaître avant que je puisse le lire. J'ai donc essayé de 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 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é un pause suivi par exit à la chaîne, résultant en:

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

Cela fonctionne comme un charme - RegAsm fonctionne sur le fichier et montre 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 quand une touche est enfoncée.

P.S. Pour les autres personnes intéressées, vous pouvez utiliser les entrées de fichier .reg suivantes pour ajouter une association dllfile aux fichiers .dll, puis une extension de commande RegAsm (notez les guillemets et backslashes é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"

Maintenant, j'ai un joli menu contextuel pour enregistrer un assemblage.


5
2018-01-26 20:35



Un nombre de symboles de traitement peut être utilisé lors de l'exécution de plusieurs commandes sur la même ligne, et peut conduire au traitement de la redirection dans certains cas, en modifiant la sortie dans les autres cas, ou simplement échouer. Un cas important consiste à 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 les commandes utilisant des variables sont placées sur la même ligne, vous devez utiliser l'expansion différée 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

5
2017-08-03 14:31