我有一个批处理文件,我想在其中调用子程序,并让它们返回给我一个输出字符串。
我尝试了setlocal
和endlocal
的各种组合,%字符的不同变体以及不同的方法:没有任何效果。我在网上搜索过,但我不认为我正在搜索正确的东西。这是尝试设置一个全局变量并更改引用指向的内容,但我无法获得语法,或者可能有更好的方法。这是我的代码:
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函数这样的标签,并让它返回一个值?
答案 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