2012-04-13 17 views
42

¿hay algo que imite un método como uno lo sabe de Java, C# etc.? Tengo 5 líneas de comandos en un archivo por lotes, esas 5 líneas se usan en más de un lugar dentro del archivo por lotes. No puedo usar un goto, porque dependiendo del nivel de error creado por esas 5 líneas, tengo diferentes acciones a continuación. Intenté poner mis 5 líneas dentro de un archivo de proceso por lotes 5lines.bat, pero el archivo original por lotes original.bat solo llama a 5lines.bat y no ejecuta los comandos después de la llamada a 5lines.bat): así es como se ve mi original.bat como:¿Algo parecido a una función/método en archivos por lotes?

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

¡No hay salida o algo así en 5lines.bat! ¿Cómo puedo asegurarme de que se llame a la línea después de 5lines.bat?

Respuesta

16

La colocación de las funciones reutilizables en un archivo por lotes separados haría Ciertamente funcionan para simular una función.

El problema es que debe usar el comando call para garantizar que el control regrese a la persona que llama después de que el segundo archivo de proceso por lotes termine de ejecutarse.

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

Perfecto, gracias! –

56

Usted podría utilizar el comando de llamada:

call:myDosFunc 

y luego definir la función de esta manera:

: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 

Fuente: Batch Functions

+0

Gracias también, el comando de llamada era de hecho, lo que me estaba perdiendo. –

+0

¡No hay problema! Me alegro de que funcionó! – Erwald

+5

Pero, ¿cómo funciona? ¿Cuál es la magia en ese 'goto: eof'? – Calmarius

4

Usted podría tratar de usar los ejemplos que aparecen en this page

Alternativamente, usted podría poner las líneas comunes en otro archivo por lotes que llama desde la principal

+0

¡Buen enlace! (Aunque terminé simplemente usando call 5lines.bat) –

7

Solución:

@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 

importante poner EXIT/B al final de cada función, así como antes de la definición de funciones comienzan, en mi ejemplo, esto es:

EXIT/B % ERRORLEVEL%

1

Aquí hay un 'piratear' que le permitirá tener "anonymous" functions en archivos por lotes: 0

@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 

El bloque de función anónima se debe colocar inmediatamente después de la instrucción de llamada y debe terminar con la declaración de salida

el truco es que CALL utiliza internamente GOTO y luego vuelve a la línea donde el CALL fue ejecutado. Con la doble expansión, se activa el mensaje de ayuda GOTO (con el argumento %%/?%%) y luego continúa la secuencia de comandos. Pero una vez finalizado, vuelve al CALL, por eso es necesaria la instrucción if.

3

simplemente para la corrección, también puede pasar parámetros a la función:

función de llamada

call :myDosFunc 100 "string val" 

cuerpo de la función

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
Cuestiones relacionadas