web-dev-qa-db-fra.com

Quelque chose comme une fonction / méthode dans des fichiers batch?

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?

53
stefan.at.wpf

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
21
Cody Gray

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

70
Erwald

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
22
Shital Shah

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%

14
DmitrySemenov

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

5
Attila

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.

2
npocmaka

Pour un autre excellent tutoriel sur l'écriture de code de fichier batch réutilisable - voir excellente bibliothèque de Richie Lawrence .

1
jwfearn

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%
1
pasha