y a-t-il quelque chose qui imite une méthode comme on la connaît depuis Java, C # etc.? J'ai 5 lignes de commandes dans un fichier batch, ces 5 lignes sont utilisées à plusieurs endroits dans le fichier batch. Je ne peux pas utiliser de goto, car en fonction du niveau d'erreur créé par ces 5 lignes, j'ai différentes actions qui suivent. J'ai essayé de mettre mes 5 lignes dans un fichier batch 5lines.bat, mais le fichier batch original original.bat n'appelle que 5lines.bat et n'exécute pas les commandes après l'appel à 5lines.bat): Voilà à quoi ressemble mon original.bat comme:
5lines.bat
echo this gets never called, how to make sure this gets called?
Il n'y a pas de sortie ou quelque chose comme ça dans 5lines.bat! Comment puis-je m'assurer que la ligne après 5lines.bat est appelée?
Placer les fonctions réutilisables dans un fichier de commandes distinct fonctionnerait certainement pour simuler une fonction.
Le hic est que vous devez utiliser la commande call
afin de vous assurer que le contrôle revient à l'appelant une fois le deuxième fichier de commandes terminé.
call 5lines.bat
echo this will now get called
Vous pouvez utiliser la commande call:
call:myDosFunc
Et puis définissez la fonction de cette façon:
:myDosFunc - here starts the function
echo. here the myDosFunc function is executing a group of commands
echo. it could do a lot of things
goto:eof
Source: Fonctions batch
Juste pour être complet, vous pouvez également passer des paramètres à la fonction:
Appel de fonction
call :myDosFunc 100 "string val"
Corps de fonction
:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof
Solution:
@ECHO OFF
call:header Start Some Operation
... put your business logic here
... make sure EXIT below is present
... so you don't run into actual functions without the call
call:header Operation Finished Successfully
EXIT /B %ERRORLEVEL%
:: Functions
:header
ECHO =================================================
ECHO %*
ECHO =================================================
EXIT /B 0
Il est important de mettre EXIT/B à la fin de chaque fonction, ainsi qu'avant le début des définitions de fonction, dans mon exemple, c'est:
SORTIE/B% NIVEAU D'ERREUR%
Vous pouvez essayer d'utiliser les exemples listés sur cette page
Alternativement, vous pouvez mettre les lignes communes dans un autre fichier batch que vous appelez à partir du fichier principal
Voici un 'hack' qui vous permettra d'avoir fonctions "anonymes" dans les fichiers batch:
@echo off
setlocal
set "anonymous=/?"
:: calling the anonymous function
call :%%anonymous%% a b c 3>&1 >nul
:: here the anonymous function is defined
if "%0" == ":%anonymous%" (
echo(
echo Anonymous call:
echo %%1=%1 %%2=%2 %%3=%3
exit /b 0
)>&3
::end of the anonymous function
Le bloc de fonction anonyme doit être placé juste après l'instruction call et doit se terminer par l'instruction exit
l'astuce est que CALL
utilise en interne GOTO
puis retourne à la ligne où le CALL
a été exécuté. Avec la double extension, le message d'aide GOTO est déclenché (avec %%/?%%
argument), puis continue le script. Mais une fois terminé, il revient à CALL
- c'est pourquoi l'instruction if est nécessaire.
Pour un autre excellent tutoriel sur l'écriture de code de fichier batch réutilisable - voir excellente bibliothèque de Richie Lawrence .
Je ne sais pas si c'était évident à partir d'autres réponses, mais juste pour être explicite, je poste cette réponse. J'ai trouvé d'autres réponses utiles en écrivant le code ci-dessous.
echo what
rem the third param gives info to which label it should comeback to
call :myDosFunc 100 "string val" ComeBack
:ComeBack
echo what what
goto :eof
:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
set returnto=%~3
goto :%returnto%