2012-04-13 2 views
42

Gibt es irgendwas, das eine Methode nachahmt, wie man sie von Java, C# etc. kennt? Ich habe 5 Befehlszeilen in einer Batch-Datei, diese 5 Zeilen werden an mehr als einer Stelle in der Batch-Datei verwendet. Ich kann kein Goto verwenden, da abhängig von dem Fehlerlevel, der durch diese 5 Zeilen erzeugt wird, verschiedene Aktionen folgen. Ich habe versucht, meine 5 Zeilen in eine Batch-Datei 5lines.bat setzen, aber die ursprüngliche Batch-Datei original.bat ruft nur 5lines.bat und führt nicht die Befehle nach dem Aufruf an 5lines.bat): So sieht meine original.bat aus wie:So etwas wie eine Funktion/Methode in Batch-Dateien?

5lines.bat 
echo this gets never called, how to make sure this gets called? 

Es gibt keinen Ausgang oder so etwas in 5lines.bat! Wie kann ich sicherstellen, dass die Zeile nach 5lines.bat aufgerufen wird?

Antwort

16

die wiederverwendbaren Funktionen in eine separate Batch-Datei platzieren würde sicherlich arbeiten, um eine Funktion zu simulieren.

Der Catch ist, dass Sie den Befehl call verwenden müssen, um sicherzustellen, dass die Kontrolle an den Aufrufer zurückkehrt, nachdem die zweite Batch-Datei ausgeführt wurde.

call 5lines.bat 
echo this will now get called 
+0

Perfekt, danke! –

56

Sie können den Anruf Befehl:

call:myDosFunc 

und dann die Funktion auf diese Weise definieren:

: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 

Quelle: Batch Functions

+0

Sie zu danken, war der Aufruf-Befehl in der Tat, was ich vermisste. –

+0

Kein Problem! Schön, dass es geklappt hat! – Erwald

+5

Aber wie funktioniert es? Was ist die Magie in diesem "goto: eof"? – Calmarius

4

Sie könnten versuchen, die Beispiele auf this page

Alternativ aufgeführt zu verwenden, können Sie die gemeinsame Leitungen in einer anderen Batch-Datei setzen könnten, die Sie von der Haupt nennen ein

+0

Toller Link! (obwohl ich am Ende einfach Anruf 5lines.bat verwendete) –

7

Lösung:

@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 

Wichtige EXIT/B am Ende jeder Funktion, sowie vor Funktionsdefinitionen zu starten, in meinem Beispiel zu setzen dies ist:

EXIT/B % ERRORLEVEL%

1

Hier ist ein 'hack', die Sie "anonymous" functions in Batch-Dateien haben können:

@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 

Der anonyme Funktionsblock sollte direkt nach dem Aufruf Anweisung platziert werden und mit Exit-Anweisung

der Trick besteht darin, dass CALL intern verwendet GOTO und dann auf die Linie zurück enden muss, wo die CALL ausgeführt wurde. Bei der Doppelexpansion wird die GOTO-Hilfemeldung ausgelöst (mit %%/?%% Argument) und dann das Skript fortgesetzt. Aber nachdem es fertig ist, kehrt es zu CALL zurück - deshalb wird die if-Anweisung benötigt.

3

Nur der Vollständigkeit halber können Sie auch Parameter an die Funktion übergeben:

Funktionsaufruf

call :myDosFunc 100 "string val" 

Funktionskörper

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
Verwandte Themen