Calling function from included batch file with a parameter

前端 未结 3 1196
庸人自扰
庸人自扰 2021-01-14 07:15

In my main batch file I include another batch file and want to call a function defined in there, code looks like following:

@echo off
call define_wait.bat

i         


        
3条回答
  •  时光说笑
    2021-01-14 08:10

    I wasn't aware of this until jeb commented it, but here's a quick demonstration of the call bug he mentioned, using some utility functions I had lying around.

    functions.bat:

    :length <"string">
    rem // sets errorlevel to the string length (not including quotation marks)
    setlocal disabledelayedexpansion
    if "%~1"=="" (endlocal & exit /b 0) else set ret=1
    set "tmpstr=%~1"
    for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        setlocal enabledelayedexpansion
        if not "!tmpstr:~%%I,1!"=="" (
            for %%x in ("!tmpstr:~%%I!") do endlocal & (
                set /a ret += %%I
                set "tmpstr=%%~x"
            )
        ) else endlocal
    )
    endlocal & exit /b %ret%
    
    :password 
    rem // prompts user for password, masks input, and sets return_var to entered value
    setlocal disabledelayedexpansion
    

    main.bat:

    @echo off & setlocal
    
    rem // demo return value
    call :password pass
    
    setlocal enabledelayedexpansion
    echo You entered !pass!
    
    rem // demo bubbling up of %ERRORLEVEL%
    call :length "!pass!"
    echo Password length is %ERRORLEVEL%
    
    endlocal
    goto :EOF
    
    rem // ====== FUNCTION DECLARATIONS =======
    
    :length <"string">
    :password 
    functions.bat %*
    

    Output:

    Password? *********
    You entered something
    Password length is 9

    This web page offers an explanation:

    If you execute a second batch file without using CALL you may run into some buggy behaviour: if both batch files contain a label with the same name and you have previously used CALL to jump to that label in the first script, you will find execution of the second script starts at the same label. Even if the second label does not exist this will still raise an error "cannot find the batch label". This bug can be avoided by always using CALL.

    If you've ever done any coding in C++, it helps to think of the labels in main.bat as function declarations in a .h file, while the labels in functions.bat would correspond to function definitions in a .cpp file. Or in .NET, the main.bat labels would be like DllImport("functions.bat") so to speak.

提交回复
热议问题