batch-file
Les meilleures pratiques
Recherche…
Introduction
Ce sujet se concentrera sur les choses que l’on devrait (pas obligatoire) faire dans un fichier de commandes. L'utilisation de ces "meilleures pratiques" peut améliorer l'effet et la fonction d'un fichier de commandes.
Citations
La plupart des scripts de lot en ligne comportent de nombreux problèmes de devis.
Exemples et solutions
Exemple A
if %var%==abc echo Test
Ce code fonctionne - lorsque le contenu de %var%
ne contient pas d'espace ou d'autres caractères spéciaux. Supposons maintenant que %var%
contient 1 espace. Maintenant, cmd.exe
voit:
if ==abc echo Test
Cela provoquerait un échec car cmd.exe
ne comprend pas cette syntaxe.
Solution A
if "%var%"=="abc" echo Test
En utilisant des guillemets, cmd.exe
considère l'intégralité de %var%
(y compris l'espace et les caractères spéciaux) comme une seule chaîne normale. Pourtant, ce n'est pas la méthode de comparaison la plus sûre. Le plus sûr utilise echo
, pipe
et findstr
.
Exemple b
cd C:\User\Spaced Name\Spaced FileName.txt
cd
ne changera que le répertoire en C:\User\Spaced
, car cd
accepte uniquement un argument de chemin.
Solution B
Simplement en ajoutant des guillemets sur le chemin, le problème serait résolu.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Il y a aussi quelques exemples qui fonctionnent mieux en utilisant des guillemets, comme set /a
, etc.
Code Spaghetti
Le code spaghetti signifie un extrait de code qui utilise de nombreuses structures, souvent déroutantes. Tels que GOTO
, exceptions et code incohérent.
Exemples et solutions
Exemple A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Ce programme est livré avec beaucoup de sauts, ce qui nous rend plus difficile de savoir exactement ce que fait le script.
Solution A
@echo off
for /l %%G in (0,1,10) echo %%G
En utilisant moins de GOTO
, nous avons considérablement réduit la quantité de code et nous pouvons nous concentrer sur le code réel.
Exemple b
Considérez les déclarations suivantes.
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
Cet extrait nécessite beaucoup d' goto
et peut être source de confusion pour le débogage. Pour simplifier ces instructions, nous pouvons utiliser la commande d' call
. Voici le script ci-dessus dans une meilleure condition.
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
Les deux scripts produisent exactement le même résultat, mais le nouveau script est beaucoup plus court et plus clair.