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?
la source
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?
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:
la source
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 unecommand2
foiscommand1
terminé. Le succès ou l'échec decommand1
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).la source
;
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-planprogname &
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
la source
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):
la source
Vous pouvez utiliser l' appel pour surmonter le problème des variables d'environnement évaluées trop tôt - par exemple
la source
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 oucmd /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.
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:
la source
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
cmd /c ipconfig /all & Output.txt
Cette commande exécute la commande et ouvre le
Output.txt
fichier en une seule commandela source
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 versPause
, 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é unpause
suivi parexit
à 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):
J'ai maintenant un joli menu contextuel pour enregistrer un assemblage.
la source
Pour exécuter deux commandes en même temps, vous devez mettre un symbole & (esperluette) entre les deux commandes. Ainsi:
À votre santé!
la source
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:
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.
la source
Eh bien, vous avez deux options: la tuyauterie, ou tout simplement
&
:Ou,
Piping (
|
) est plus pour prendre la sortie d'une commande et la mettre dans une autre. Et (&
) dit simplement exécuter ceci et cela.la source
&
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.
la source
Un autre exemple: par exemple, lorsque nous utilisons le
gulp
système de génération, au lieu degulp
- par défaut> buildgulp build
- build build-foldergulp watch
- démarrer la surveillance des fichiersgulp dist
- construire un dossier distNous pouvons le faire avec une seule ligne:
la source
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
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%
?la source
Utiliser le
&
symbole dans les fenêtres pour utiliser la commande sur une seule lignecomme sous linux que nous utilisons,
la source
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.la source
C'est simple: il suffit de les différencier par des
&&
signes. Exemple:"Goodbye World" sera imprimé après "Hello World".
la source
&&
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.