User Tools

Site Tools


mgenay:technique:astuces_.bat

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
mgenay/technique/astuces_.bat.txt · Last modified: by 127.0.0.1