Double delayed expansion in a batch?

I am trying to double my slow expansion, if that makes sense. Here is what I want.

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

and then displayed hello. This is not my actual code, but an example of how I need it.

+4
source share
3 answers

You can add calland combine your first delayed expansion with double interest, like this.

@echo off
setlocal enabledelayedexpansion

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

call echo %%!%var3%!%%

Seems terribly confusing to me. I would probably rewrite the script so that such a trick would not be needed if I were me.


:. , . , , 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);

, .

+5

( , rojo). "" %:

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

call ():

@echo off
setlocal enabledelayedexpansion

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

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

EDIT: 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%!
)

This program correctly displays "hello" at the end; It takes about 2.51 seconds to run on my computer.

The method is quite short, so there is no way to improve it; The obvious modification is changing the loop gototo for(while). Here it is:

@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

This code takes about 1.22 seconds to run, i.e. only 48.6% of your method (2 times faster) ;)

+5
source

Source: https://habr.com/ru/post/1617296/


All Articles