Batch file call sub-batch file to pass n paramenters and return without use of file

后端 未结 3 1164
死守一世寂寞
死守一世寂寞 2020-12-13 09:29

I looking for a way using windows batch file that call sub-batch file which pass 1-9 parameters and return value (string) without the need of saving the return value into fi

相关标签:
3条回答
  • 2020-12-13 09:57

    You're missing a couple things:

    • Use backticks not single quotes.
    • add usebackq inside the double quotes with the tokens command.

    This character ` not this character '

    On an american english keyboard, the backtick is shift-tilde, which is usually to the left of the 1 in the number row.

    @FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i
    0 讨论(0)
  • 2020-12-13 10:09

    Small TIP

    Setlocal EnableDelayedExpansion
    IF 1==1 (
        CALL :LABEL
        echo 1: %errorlevel%
        echo 2: !errorlevel!
    )
    echo 3: %errorlevel%
    
    :LABEL
    EXIT /B 5
    

    Output will be:

    1: 0
    2: 5
    3: 5
    

    EnableDelayedExpansion allows you to use !var_name! to expand var at execution time, rather then parse time.

    0 讨论(0)
  • 2020-12-13 10:16

    Generally batch functions return values in one of two ways:

    1) A single integer value can be returned via the errorlevel by using EXIT /B n where n = some number.

    @echo off
    setlocal
    call :sum 1 2
    echo the answer is %errorlevel%
    exit /b
    
    :sum
    setlocal
    set /a "rtn=%1 + %2"
    exit /b %rtn%
    

    2) The more flexible method is to use environment variables to return one or more values

    @echo off
    setlocal
    call :test 1 2
    echo The sum %sum% is %type%
    call :test 1 3
    echo The sum %sum% is %type%
    exit /b
    
    :test
    set /a "sum=%1 + %2, type=sum %% 2"
    if %type%==0 (set "type=even") else (set "type=odd")
    exit /b
    

    The name of the variable where the answer is to be stored can be passed in as a parameter! And the intermediate values can be hidden from the main program.

    @echo off
    setlocal
    call :test 1 2 sum1 type1
    call :test 1 3 sum2 type2
    echo 1st sum %sum1% is %type1%
    echo 2nd sum %sum2% is %type2%
    exit /b
    
    :test
    setlocal
    set /a "sum=%1 + %2, type=sum %% 2"
    if %type%==0 (set "type=even") else (set "type=odd")
    ( endlocal
      set "%3=%sum%"
      set "%4=%type%"
    )
    exit /b
    

    For a complete explanation of how the last example works, read this excellent batch function tutorial at DOStips.

    Update

    The above still has limits as to the content that can be returned. See https://stackoverflow.com/a/8254331/1012053 for an alternative method based on FOR that supports a wider range of values. And see https://stackoverflow.com/a/8257951/1012053 for a "magical" technique that can safely return absolutely any value with length < ~8190, under any circumstance.

    0 讨论(0)
提交回复
热议问题