Batch file 批处理文件调用子批处理文件以传递n个参数并返回,而不使用文件
我正在寻找一种使用windows批处理文件的方法,该文件调用子批处理文件,子批处理文件传递1-9个参数和返回值(字符串),而无需将返回值保存到文件/etc中。返回值保存到变量中,就像@for/F中一样 我看着Batch file 批处理文件调用子批处理文件以传递n个参数并返回,而不使用文件,batch-file,Batch File,我正在寻找一种使用windows批处理文件的方法,该文件调用子批处理文件,子批处理文件传递1-9个参数和返回值(字符串),而无需将返回值保存到文件/etc中。返回值保存到变量中,就像@for/F中一样 我看着 @FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i 及 我不知道我该怎么做 编辑:dbenham多少回答了我的问题。他的例子是在批处理文件的主要部分和函数之间。我的问题是在两个不同的批处理文件之间。基于dbe
@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i
及
我不知道我该怎么做
编辑:dbenham多少回答了我的问题。他的例子是在批处理文件的主要部分和函数之间。我的问题是在两个不同的批处理文件之间。基于dbenham回答这是下面的布局
主批处理文件
CALL sub_batch_file.bat return_here "Second parameter input"
REM echo is Second parameter input
ECHO %return_here%
REM End of main-batch file
sub_batch_file.bat
@ECHO OFF
SETLOCAL
REM ~ removes the " "
SET input=%~2
(
ENDLOCAL
SET %1=%input%
)
exit /b
REM End of sub-batch file
你错过了几件事:
- 使用反勾号而不是单引号
- 使用tokens命令在双引号内添加usebackq
@对于(`%find_OS_version%`)中的/F“usebackq tokens=*”%%i,设置OS_VER=%%i通常批处理函数以以下两种方式之一返回值: 1) 可以使用
EXIT/B n
通过errorlevel返回单个整数值,其中n=某个数字
@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) 更灵活的方法是使用环境变量返回一个或多个值
@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
存储答案的变量的名称可以作为参数传入!中间值可以对主程序隐藏
@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
要完整解释最后一个示例的工作原理,请阅读DOStips上的这篇精彩文章
更新
对于可以返回的内容,上述内容仍然有限制。请参阅,以获取基于的支持更大范围值的替代方法。并查看一种“神奇”技术,它可以在任何情况下安全地返回长度为<~8190的任何值。SmallTIP
Setlocal EnableDelayedExpansion
IF 1==1 (
CALL :LABEL
echo 1: %errorlevel%
echo 2: !errorlevel!
)
echo 3: %errorlevel%
:LABEL
EXIT /B 5
输出将是:
1: 0
2: 5
3: 5
EnableDelayedExpansion允许您使用!你的名字!在执行时而不是解析时展开var。如果在
find\u OS\u version
中没有单引号(撇号),也可以。没有特别需要使用反引号和usebackq
。而且,这个答案并不能解决OP的问题。严肃口音的位置也是错误的;tilde需要移位,grave不需要。我明白了,如何使用@FOR/F“usebackq tokens=*”将参数传递给子批处理文件?唯一需要usebackq的时间是在读取名称包含空格的文件时。我不知道在执行命令时是否需要USEBACKQ。@EitanT-命令本身可以包含所需的数量的,
,只要命令在两端都包含在,
中即可。无需逃避或担心内部”
。使用USEBACKQ时,backtick也是如此。子批如何返回其值?在屏幕上?还是你被卡住了?现在我有了返回变量echo,因为“@FOR/F”捕捉到了echo并保存到变量中。因此,简而言之,我希望返回save-into变量,同时能够传递1到9个参数。Awesome-enabledayedexpansion
正是我所需要的,谢谢
1: 0
2: 5
3: 5