批量双重延迟扩展?

时间:2015-11-24 16:54:05

标签: batch-file

如果这有任何意义,我试图将延迟扩张加倍。这就是我想要的。

set var1=hello
set var2=var1
set var3=var2
echo %!%var3%!%

然后显示hello。这不是我的实际代码,而是我需要它如何工作的一个例子。

3 个答案:

答案 0 :(得分:6)

你可以添加一个call并用这样的双倍百分比包围你的第一个延迟扩展。

@echo off
setlocal enabledelayedexpansion

set "var1=hello"
set "var2=var1"
set "var3=var2"

call echo %%!%var3%!%%
但是,对我来说,似乎有点令人费解。如果我是我的话,我可能会重写脚本以便不需要这样的技巧。

编辑:由于此处添加了太多解决方案,我将提出另一个解决方案。这是一个从头到尾遵循变量线的子程序,即使它的深度为1000级。就像学术练习一样。

@echo off
setlocal

set "var1=hello"
for /L %%I in (2,1,1000) do (
    set /a X = %%I - 1
    setlocal enabledelayedexpansion
    for %%x in (!X!) do endlocal & set "var%%I=var%%x"
)

call :follow var1000
goto :EOF

:follow <varname>
setlocal enabledelayedexpansion
set "var=!%~1!"
:follow_loop
if defined !%var%! (
    set "var=!%var%!" & goto follow_loop
) else (
    echo !%var%!
)

另一个是使用批处理+ JScript混合的另一个(因为JScript while循环比批处理goto循环更快)。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "var1=hello"
for /L %%I in (2,1,1000) do (
    set /a X = %%I - 1
    setlocal enabledelayedexpansion
    for %%x in (!X!) do endlocal & set "var%%I=var%%x"
)

cscript /nologo /e:JScript "%~f0" "var1000"
goto :EOF

@end // end batch / begin JScript hybrid chimera
var env = WSH.CreateObject('Wscript.Shell').Environment('Process'),
    itm = WSH.Arguments(0);

while (env(itm)) itm = env(itm);

WSH.Echo(itm);

你的举动,Aacini。

答案 1 :(得分:6)

甚至可能没有延迟扩展(尽管甚至比rojo的答案更丑)只是解析和纠正转义%的“层数”问题:

@echo off
set var1=hello
set var2=var1
set var3=var2
call call echo %%%%%%%var3%%%%%%%

答案 2 :(得分:6)

另一个没有call(更快)的人:

@echo off
setlocal enabledelayedexpansion

set "var1=hello"
set "var2=var1"
set "var3=var2"

for %%v in (!%var3%!) do echo !%%v!

编辑回复rojo的挑战

您的代码在创建变量时出错;所有变量都包含字符串:“var!X!”最后的结果是“var!X!X”。下面是修改了变量创建部分的代码:

@echo off
setlocal EnableDelayedExpansion

set "var1=hello"
for /L %%I in (2,1,1000) do (
    set /a X = %%I - 1
    set "var%%I=var!x!"
)

call :follow var1000
goto :EOF

:follow <varname>
setlocal enabledelayedexpansion
set "var=!%~1!"
:follow_loop
if defined !%var%! (
    set "var=!%var%!" & goto follow_loop
) else (
    echo !%var%!
)

这个程序最后正确显示“你好”;在我的电脑上运行大约需要2.51秒。

方法很短,因此没有太多机会改进它;显而易见的修改是将goto循环更改为for(while)循环。这是:

@echo off
setlocal EnableDelayedExpansion

set "var1=hello"
for /L %%I in (2,1,1000) do (
    set /a X = %%I - 1
    set "var%%I=var!x!"
)

call :follow var1000
goto :EOF


:follow <varname>
set "var=%~1"
cmd /V:ON /C for /L %%? in () do @for %%v in (^^!var^^!) do @if defined %%v (set "var=^!%%v^!") else echo %%v ^& exit

此代码运行大约需要1.22秒,也就是说,只需48.6%的方法(快2倍) ;)