突然想到一个变量嵌套的好办法
bat吧
全部回复
仅看楼主
level 13
一般嵌套变量,是用延时变量扩展,是吧。
比如
setlocal ENABLEDELAYEDEXPANSION
set a=!a:~%b%,1!
set n=!pro%a%!
……
其实 这样也是可以的,对吧。
call set a=%%a:~%b%,1%%
……
那么……岂不是还可以这样?
call call set n=%%%%pro%%a:~%b%,1%%%%%%
……
2017年04月20日 05点04分 1
level 13
这么说的话,for也不必使用延迟扩展变量了。
for %i in (2) do (set /a v=%i+10&call echo %%v%%)
注:此为cmd命令,非bat命令。两种格式for写法略不同
2017年04月20日 05点04分 4
level 13
再来一个例子:
set a2=1
set b3=2
set c=3
call call echo.%%%%a%%b%c%%%%%%%
猜猜运行结果是多少?
2017年04月20日 05点04分 5
level 13
call set
#=1&&call echo,%%#
%%
call set #=2&&call:1
call set #=3&&for /f "delims=" %%i in ('call echo,%%#%%')do echo,%%i
pause
:1
echo,%#%
goto:eof
2017年04月20日 07点04分 7
level 13

2017年04月21日 01点04分 8
level 3
[阴险]
2017年04月21日 23点04分 9
level 12

2017年04月22日 04点04分 10
level 6
但是call是函数调用,cpu开销比变量延迟要高很多,从性能上来说还是用变量延迟的好。
2017年04月22日 05点04分 11
level 6
@echo off
REM batch setlocal堆栈演示。child scope可以读取parent scope的变量,反之不行。
REM %maxlevel% 为最大嵌套层数,batch最大堆栈为32层。但是CALL可以突破此限制。
set "maxlevel=50"
set "separator= "
set "level=0"
REM 循环测试setlocal
echo,LOOP SETLOCAL TEST
:instack
2>nul,setlocal||goto outstack
set /a "level+=1"
set "indent=%indent%%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% goto instack
:outstack
echo,%indent%OutStack:Level=%level%
endlocal
if %level% gtr 0 goto outstack
>nul,pause
REM CALL 无参数测试setlocal
echo,CALL RECURSIVE SETLOCAL TEST
call :recurse
>nul,pause
REM CALL 有参数测试setlocal
echo,CALL RECURSIVE WITH PARAMETERS SETLOCAL TEST
call :recurseWithParameters 0 ""
>nul,pause
exit /b
:recurse
2>nul,setlocal||exit /b
set /a "level+=1"
set "indent=%indent%%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% call :recurse
echo,%indent%OutStack:Level=%level%
endlocal
exit /b
:recurseWithParameters
2>nul,setlocal||exit /b
set /a "level=%~1+1"
set "indent=%~2%separator%"
echo,%indent%InStack:Level=%level%
if %level% lss %maxlevel% call :recurseWithParameters %level% "%indent%"
echo,%indent%OutStack:Level=%level%
endlocal
exit /b
2017年04月22日 05点04分 12
1