Batch file 成批双延迟扩展?

Batch file 成批双延迟扩展?,batch-file,Batch File,如果这有意义的话,我正试图将我延迟的扩张扩大一倍。这是我想要的 set var1=hello set var2=var1 set var3=var2 echo %!%var3%!% 然后显示hello。这不是我的实际代码,而是我需要它如何工作的一个示例。您可以添加一个调用,并用这样的两个百分比围绕您的第一次延迟扩展 @echo关闭 延迟扩展 设置“var1=hello” 设置“var2=var1” 设置“var3=var2” 呼叫echo%%!%var3%!% 不过,对我来说,这似乎令人毛骨

如果这有意义的话,我正试图将我延迟的扩张扩大一倍。这是我想要的

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

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

您可以添加一个
调用
,并用这样的两个百分比围绕您的第一次延迟扩展

@echo关闭
延迟扩展
设置“var1=hello”
设置“var2=var1”
设置“var3=var2”
呼叫echo%%!%var3%!%
不过,对我来说,这似乎令人毛骨悚然。如果我是我的话,我可能会重写剧本,让这样的诡计不再需要


编辑:既然这里添加了这么多解决方案,我将提出另一个解决方案。这里有一个子程序,它将从头到尾跟随变量行,即使它有1000层深。就像一个学术练习

@echo关闭
setlocal
设置“var1=hello”
对于(2,11000)do中的/L%%I(
set/ax=%%I-1
延迟扩展
对于(!x!)中的%%x,执行endlocal并设置“var%%I=var%%x”
)
电话:跟随var1000
后藤:EOF
:跟随
延迟扩展
设置“var=!%~1!”
:跟随循环
如果已定义!%var%!(
设置“var=!%var%!”&转到跟随循环
)否则(
回声!%var%!
)
这里还有一个使用batch+JScript混合的方法(因为JScript
while
循环比batch
goto
循环快)

@如果(@code节==@Batch)@那么
@回音
setlocal
设置“var1=hello”
对于(2,11000)do中的/L%%I(
set/ax=%%I-1
延迟扩展
对于(!x!)中的%%x,执行endlocal并设置“var%%I=var%%x”
)
cscript/nologo/e:JScript“%~f0”“var1000”
后藤:EOF
@结束//结束批处理/开始JScript混合嵌合体
var env=WSH.CreateObject('Wscript.Shell').Environment('Process'),
itm=WSH.Arguments(0);
而(env(itm))itm=env(itm);
WSH.Echo(itm);

你的行动,阿奇尼。

即使没有延迟的扩展(尽管比罗乔的回答更难看),也有可能,只是解析和正确转义
%的“层”的数量问题:

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

另一个没有
呼叫的
(更快):


编辑:回答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%!
)

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

我刚刚编辑了我的答案,将其包括在内。英雄所见略同!您的代码在创建变量时出错。请看我的编辑。@Aacini已修复,我想。Master。我很遗憾,我只有一个+1可以给予。但我认为你错了,我的代码有错误。当我运行我的时,输出是
help
@rojo:您的第一个代码在这里显示这个结果:
var!X!X
。我在
调用
之前插入了一个
SET VAR
命令,得到了这样的结果:
var1=hello
var10=VAR!X
var100=var!X
var1000=var!X
var101=var!X。。。混合代码显示:
var!XWindows 8.1…太奇怪了。我的WIn10家庭影院电脑按预期运行了我的脚本,但我的WIn10笔记本电脑给出的结果与您得到的结果相同。我在脚本中移动了
endlocal
,现在它在笔记本电脑上工作。我刚刚测试了我的JScript混合版与您的纯批处理解决方案。我的平均成绩是2.6秒。你的,2.55秒。我使用PowerShell的
Measure命令
cmdlet来计时执行。@rojo:你是说我的纯批处理代码比你的JScript混合代码运行得快吗<代码>^ u^
这很有趣!
@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%!
)
@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