Batch file 如何从循环中的函数获取值返回?

Batch file 如何从循环中的函数获取值返回?,batch-file,cmd,Batch File,Cmd,我正在尝试解决如何在循环中测试函数调用的返回值,并在函数返回特定值时中断循环 下面的批处理脚本是我的尝试,函数在前2次函数调用时返回预期值。当在循环中进行调用时,我不知道如何测试返回值。请告诉我如何在循环中测试函数返回值 SET var1=2 SET var2=0 CALL :FUNC %var1 var2 ECHO var2 is: %var2% REM ============================ SET var1=6 SET var2=0 CALL :FUNC %var1

我正在尝试解决如何在循环中测试函数调用的返回值,并在函数返回特定值时中断循环

下面的批处理脚本是我的尝试,函数在前2次函数调用时返回预期值。当在循环中进行调用时,我不知道如何测试返回值。请告诉我如何在循环中测试函数返回值

SET var1=2
SET var2=0
CALL :FUNC %var1 var2
ECHO var2 is: %var2%

REM ============================

SET var1=6
SET var2=0
CALL :FUNC %var1 var2
ECHO var2 is: %var2%

REM ============================

SETLOCAL EnableDelayedExpansion
SET list=1 0 3 4
FOR %%n IN (%list%) DO (
    CALL :FUNC %%n rtn
    IF !rtn! == 0 (
        GOTO DONE
    )
)
ECHO rtn is: %rtn%

: DONE
PAUSE
GOTO :eof


REM %1 is an in parameter
REM %2 is an out parameter
: FUNC
SETLOCAL EnableDelayedExpansion
SET var=%1
EndLocal & SET %2=%var% & GOTO :eof

我看不出你的循环有任何问题,但是你的函数有问题。
您只需将最后一行更改为(引号是新的):
EndLocal&设置“%2=%var%”和GOTO:eof

如果没有引号,您总是在返回值后面加上一个空格,

因此,
IF!rtn!==0(
始终为false

在DOS中没有像
setlocal
goto:eof
或函数调用…这样的东西。当您编写
call:FUNC%var1 var2
时,您实际上是指
调用:FUNC%var1%var2
,不是吗?@aschipfl,是的。这不是生产批处理脚本,我写这只是为了演示我在我的生产批处理脚本中遇到了真正的问题,并且正如你所指出的那样有一个打字错误。谢谢你的回答。但是我不明白为什么它需要引号。有什么参考资料我可以阅读吗?@simon
SET%2=%var%&GOTO:eof
注意
%var%
和符号
&
之间的空格。这是额外的空格不是分隔符,但被视为分配的一部分。请将其与
SET%2=%var%&GOTO:eof
进行比较,并查看差异。通常与
SET“a=b”的形式进行比较
最后一个引号标志着作业的结束,
set
命令忽略最后一个引号之后的所有内容。
set
命令的这种特定语法并没有官方参考。@simon
set a=“b”
set“a=b”非常不同。
在第一种情况下
a
包含
“b”
(两个引号和一个空格,共4个字符),在第二种情况下
a
仅包含一个
b
。第二种形式通常被称为扩展集syntax@simon它们是两个不同的东西。使用形式
set a=“b”&…
不仅将在变量中存储空格,还将在引号中存储空格。请尝试
设置a=“b”&echo[%a%]
查看结果。@simon,
&
不是由
专门识别的,它是在前面分析命令行时识别的。。。