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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow