如何在变量中获取变量(%var1%var2 %%)

时间:2016-01-12 07:54:52

标签: variables batch-file set

我试图获取用户输入的字符串,然后让文本滚动。

到目前为止我所拥有的:

@echo off
setlocal
set /p myString=String:
cls

call :StringLenght result myString
:ECHO
set /a result=%result%-1
set myString=%mystring:~%result%%
echo %myString%
ping -n 2 localhost>nul
cls

:StringLenght <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    goto ECHO
)

现在在这一点它不起作用:

set myString=%mystring:~%result%%

当我在变量%%中时,我无法从变量中获取String(听起来很奇怪,但我认为你可以想象我的意思)。

2 个答案:

答案 0 :(得分:2)

您需要延迟扩展才能发挥作用。

这是概念:

@echo off
setlocal EnableDelayedExpansion

set "mystring=mousetail"
set result=5
echo %mystring%
echo !mystring:~%result%!

应该很容易在您的代码中实现。

答案 1 :(得分:0)

没有延迟扩展的替代方法是使用call命令,如下所示:

@echo off

set "myString=something"
set "result=4"
echo %myString%
call echo %%myString:~%result%%%

Result的扩展是立即完成的,但myString的扩展是针对由cmd打开的新call实例执行的:

  • 首先,%%之后的echo被一个%替换;
  • 其次,%result%已展开,即由其值4取代;
  • 第三,最后一个%%被一个%;
  • 取代
  • 最后,命令行echo %myString:~4%将传递到由cmd打开的新call实例,从而显示thing;

请注意,这仅适用于批处理文件,但不能直接在命令提示符(cmd)中使用。

如果您需要延迟扩展两个嵌套变量,可以使用for循环:

@echo off

set "myString=something"
set "result=4"
setlocal EnableDelayedExpansion
echo !myString!
for %%I in (!Result!) do echo !myString:~%%I!
endlocal

这是有效的,因为在应用延迟扩展之前展开了for变量%%I,因此循环体接收命令行echo !myString:~4!