【问题标题】:Batch file call sub-batch file to pass n paramenters and return without use of file批处理文件调用子批处理文件传n个参数不使用文件返回
【发布时间】:2012-07-13 22:24:33
【问题描述】:

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

中所做的那样

我看

@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i

Call function/batch %arg1% %arg2%

我没有看到如何设置来做到这一点

编辑: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

【问题讨论】:

  • 子批次如何返回值?屏幕上?还是你被困在哪里?
  • 现在我有返回变量 echo 因为“@FOR /F”捕获了 echo 并保存到变量中。所以简而言之,我希望将返回保存到变量中,同时能够在 1 到 9 个参数之间传递。

标签: batch-file


【解决方案1】:

通常批处理函数以两种方式之一返回值:

1) 使用 EXIT /B n 可以通过错误级别返回单个整数值,其中 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 上出色的 batch function tutorial

更新

以上对于可以返回的内容还是有限制的。请参阅https://stackoverflow.com/a/8254331/1012053,了解基于 FOR 的替代方法,该方法支持更广泛的值。请参阅https://stackoverflow.com/a/8257951/1012053 了解一种“神奇”技术,它可以在任何情况下安全地返回绝对长度

【讨论】:

    【解决方案2】:

    提示

    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_name!在执行时扩展 var,而不是解析时。

    【讨论】:

    • 太棒了 - EnableDelayedExpansion 正是我所需要的,谢谢
    【解决方案3】:

    你错过了几件事:

    • 使用反引号而不是单引号。
    • 使用 tokens 命令在双引号内添加 usebackq。

    这个字符`不是这个字符'

    在美式英语键盘上,反引号是 shift-tilde,通常位于数字行中 1 的左侧。

    @FOR /F "usebackq tokens=*" %%i IN (`%find_OS_version%`) DO SET OS_VER=%%i

    【讨论】:

    • 单引号(撇号)也可以,如果find_OS_version 中没有的话。没有特别需要使用反引号和usebackq。此外,这个答案并不能解决 OP 的问题。
    • 重音的位置也是错误的;波浪号需要转换,严重的不需要。
    • 我明白了,如何使用 @FOR /F "usebackq tokens=*" 将参数传递给子批处理文件?
    • 唯一一次需要USEBACKQ 是在读取名称包含空格的文件时。我不知道执行命令时需要使用 USEBACKQ 的任何情况。
    • @EitanT - 命令本身可以包含任意数量的',只要该命令在任一端包含在' 中即可。无需逃避或担心内部'。使用 USEBACKQ 时的反引号也是如此。
    猜你喜欢
    • 2020-06-05
    • 2011-10-07
    • 2013-07-19
    • 2015-08-30
    • 2013-03-01
    • 2022-10-18
    • 2015-01-24
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多