Dans cette page, quelques astuces de programmation en .bat
== Astuces générales ==
=== Répertoire courant ===
Commencer tous les programmes par "cd /D %~dp0", cela vous placera dans le répertoire contenant le script .bat, quand bien même il aurait été lancé d'un autre répertoire.
Attention cependant, si on fait "call path\to\test.bat", lorsque l'on revient dans le script qui a lancé le "call", on sera dans le répertoire path\to\
=== Errorlevel et sortie de programme ===
Ne JAMAIS utiliser "exit x" dans un programme .bat. En effet, si on fait
"call path\to\test.bat", et que test.bat exécute "exit 1", le script qui a fait le "call" est lui aussi interrompu. En revanche si le script au lieu de faire "call" fait cmd /c, le problème disparait.
test.bat devient alors tributaire de la façon dont il a été exécuté.
Il faut préférer "exit /B x" (qui ne fera que sortir du "call")
=== Call interne et externe ===
On appellera Call interne, un appel dont la cible est contenue dans le script .bat considéré. Un call externe est l'appel à un autre fichier .bat.
La syntaxe de cette commande pour un call interne est la même que pour un "goto", par exemple "call :fonction". La différence avec le "goto", c'est qu'arrivé à la fin du fichier (ou après un goto :eof), l'exécution reprend après le call.
En revanche une commande "exit x" ou "exit /B x" terminera l'exécution de l'ensemble du fichier .bat considéré.
Exemple :
set /P valeur "répondez Y ou N :"
call :testval %valeur%
echo "réponse valide"
exit /B 0
:testval
IF "%1" == "Y" goto :eof
IF "%1" == "N" goto :eof
echo "réponse invalide : %1"
exit /B 1
=== call or cmd /c ===
Toujours préférer cmd /c si on est pas maître du script appellé, car si on fait "call test.bat" et que test.bat plante pour une raison quelconque ou fait un "exit x", le traitement qui a lancé le call est lui-aussi interrompu. D'autre part, si test.bat modifie le répertoire courant, ou des variables d'environnement avec SET, en sortie du call, on récupère tout le contenu du test.bat
== Troubleshot/Pourquoi mon script ne marche pas ==
=== FOR ... incrémenter ===
Lorsque l'on fait
set test=0
for /F %%i in (`dir`) do set /A test=%test%+1
%test% n'a pas la bonne valeur
En effet, la partie qui "suit" le "do" est lue par DOS non pas pour chaque élément I, mais une fois au début du for. DOS remplace alors %test% par la valeur qu'il a avant le FOR, dans notre cas, il "évalue" alors toute la commande FOR comme
for /F %%i in (`dir`) do set /A test=0+1
Après le for on a donc %test%=1
La solution est la suivante :
goto :start
#fonctions
:increment
set /A test=%test%+1
goto :eof
#debut
:start
set test=0
for /F %%i in (`dir`) do call :increment