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