web-dev-qa-db-fra.com

Ligne unique avec plusieurs commandes à l'aide du fichier de commandes Windows

J'essaie de comprendre comment fonctionnent plusieurs commandes sur une seule ligne de commande dans un fichier de commandes.

dir & md folder1 & rename folder1 mainfolder

Et autre cas avec des commandes similaires, mais & remplacé par &&.

dir && md folder1 && rename folder1 mainfolder

1. Quelle est la différence entre ces deux cas?


Autre chose que je veux demander:

Bon mot batch.bat:

dir & md folder1 & rename folder1 mainfolder

Multi-doublure batch.bat:

dir
md folder1
rename folder1 mainfolder

2. Ces lignes unifilaires et multilignes sont-elles égales en termes de procédure de fichier batch?


Et encore une chose que j'aimerais savoir:

3. Si j'appelle d'autres fichiers de commandes à partir d'un fichier main.bat, sont-ils exécutés indépendamment et simultanément? Le fichier de commandes principal n'attend pas la fin des procédures dans d'autres fichiers de commandes? Comment faire ça?

16
Quanti Monati

& entre deux commandes entraîne simplement l'exécution des deux commandes indépendamment du résultat de la première commande. Le droit de commande de & est exécuté après la commande à gauche de & terminé indépendamment du succès ou de l'erreur de la commande précédente, c'est-à-dire indépendant de la valeur de sortie/retour de la commande précédente.

&& entraîne une exécution conditionnelle de la deuxième commande. La deuxième commande n'est exécutée que si la première commande a réussi, ce qui signifie que vous avez quitté avec le code retour 0.

Pour une explication alternative, voir Exécution conditionnelle .

dir & md folder1 & rename folder1 mainfolder

est donc égal

dir
md folder1
rename folder1 mainfolder

Un remplacement multiligne pour

dir && md folder1 && rename folder1 mainfolder

serait

dir
if not errorlevel 1 (
   md folder1
   if not errorlevel 1 (
      rename folder1 mainfolder
   )
)

if not errorlevel 1 signifie que la commande précédente ( n'a pas terminé avec un code de sortie supérieur à 0 . Comme les commandes dir et md ne se terminent jamais avec une valeur négative, juste avec 0 ou plus (comme presque toutes les commandes et applications console) et la valeur 0 est le code de sortie du succès, c'est une méthode correcte pour tester la réussite de l'exécution de dir et md. Voir l'article de support Microsoft Test pour un niveau d'erreur spécifique dans les fichiers batch .

Autres sujets utiles sur le débordement de pile concernant le niveau d'erreur:

Il faut prendre soin de mélanger l'opérateur inconditionnel & avec des opérateurs conditionnels comme && et || en raison de l'ordre d'exécution n'est pas nécessairement l'ordre des commandes en ligne de commande.

Exemple:

dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

Cette ligne de commande s'exécute comme:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

La commande [~ # ~] echo [~ # ~] est toujours exécutée indépendamment du résultat de l'exécution de la première [~ # ~] dir [~ # ~] tandis que le second [~ # ~] dir [~ # ~] n'est exécuté que si d'abord [~ # ~] dir [~ # ~] échoue comme sous Windows XP ou le dossier de profil de l'utilisateur n'est pas sur le lecteur C: ou pas du tout dans un dossier Users.

Il est nécessaire d'utiliser ( et ) lors de l'exécution [~ # ~] écho [~ # ~] uniquement si d'abord [~ # ~] dir [~ # ~] échoue après la seconde [~ # ~] dir [~ # ~] indépendant du résultat de seconde [~ # ~] dir [~ # ~] .

dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

Cette ligne de commande s'exécute comme:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
    dir "%UserProfile%" /AD
    echo User profile path: "%UserProfile%"
)

Pour la réponse à la troisième question, voir ma réponse sur Comment appeler un fichier de commandes dans le dossier parent du fichier de commandes en cours? où j'ai expliqué les différences lors de l'exécution d'un fichier de commandes avec la commande call ou avec start ou avec aucune de ces deux commandes à partir d'un fichier batch.

26
Mofi