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?
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?
Réponses:
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
cmd
invite directe , donc je suppose que ce n'est pas une mauvaise habitude. :)
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.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
travaillé sans guillemets sur Windows 10.
&
- 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!
&
ne rend pas les commandes asynchrones ou parallèles. command1 & command2
s'exécutera une command2
fois command1
terminé. Le succès ou l'échec de command1
n'est pas pertinent.
&
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).
;
auparavant sous Linux
;
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.
Vous pouvez utiliser & pour exécuter les commandes l'une après l'autre. Exemple:c:\dir & vim myFile.txt
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
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%
echo
imprime l' ancienne valeur, pas la nouvelle valeur. C'est du moins ce que j'observe sur ma box Windows 7.
setlocal EnableDelayedExpansion
dans un script ou cmd /v
). Par exemple: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
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
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
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 /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, 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.
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 /b
sur une invite de commande Windows 7.
Commencez comme d'habitude, sans /b
et 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.
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.
&
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.
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.
Un autre exemple: par exemple, lorsque nous utilisons le gulp
systè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
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%
%PATH%
pour gérer le problème des parenthèses%USERPROFILE%
?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
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.
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".
&&
est un opérateur conditionnel , la commande suivante n'est exécutée que lorsque la première commande a réussi (errorlevel = 0)
Hello World
n'ait pas échoué. comme l'a dit @jeb, &&
est conditionnel. &
exécute des commandes, que la précédente ait réussi ou non.