从子例程返回值

时间:2014-04-15 07:09:40

标签: batch-file return-value

我有一个批处理文件,我想在其中调用子程序,并让它们返回给我一个输出字符串。

我尝试了setlocalendlocal的各种组合,%字符的不同变体以及不同的方法:没有任何效果。我在网上搜索过,但我不认为我正在搜索正确的东西。这是尝试设置一个全局变量并更改引用指向的内容,但我无法获得语法,或者可能有更好的方法。这是我的代码:

echo off

for %%x in (0, 1, 15) do (
    call :hex %%x RET
    set str1=%RET%
    for /l %%y in (0, 1, 15) do (
        call :hex %%y RET
        set str2=%RET%
        echo %str1%%str2%
    )
)   
goto :eof


:hex
    set _hex=0123456789ABCDEF

    set /A len=1

    set /A offset=%1

    CALL SET s=%%_hex:~%offset%,%len%%%

    set %2=%s%
    set RET=%s%

goto :eof  

我希望输出看起来像递增十六进制数字,但它只打印出FF。

发生了什么事?这种语法如何工作?如何调用像c函数这样的标签,并让它返回一个值?

1 个答案:

答案 0 :(得分:1)

@echo off

setlocal enableDelayedExpansion
set _hex=0123456789ABCDEF
for /l %%x in (==0;1;15hex==) do (

    for /f "tokens=1,2" %%A in ("%%x 1") do set "str1=!_hex:~%%A,%%B!"

    for /l %%y in (;;0==1iterator==15;;) do (
        for /f "tokens=1,2" %%A in ("%%y 1") do set "str2=!_hex:~%%A,%%B!"
        echo !str1!!str2!
    )
)

endlocal   
goto :eof

同样的逻辑,只是移除CALL只会让你的脚本变慢(进一步阅读 - http://ss64.org/viewtopic.php?id=1669; http://ss64.org/viewtopic.php?id=1667)。

还检查延迟扩展 - > http://ss64.com/nt/delayedexpansion.html