Batch file 批处理文件调用子批处理文件以传递n个参数并返回,而不使用文件

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

我正在寻找一种使用windows批处理文件的方法,该文件调用子批处理文件,子批处理文件传递1-9个参数和返回值(字符串),而无需将返回值保存到文件/etc中。返回值保存到变量中,就像@for/F中一样

我看着

@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
这个角色“不是这个角色”

在美式英语键盘上,背景符号是shift tilde,它通常位于数字行中1的左侧

@FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i
@对于(`%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