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
You're missing a couple things:
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
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.
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.