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

How to get Variable in Variable (%var1%var2%%)

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

我目前拥有的:

@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%%

当我在变量 %% 中时,我无法从变量中取出字符串(听起来很奇怪,但我想你可以想象我的意思)。

您需要延迟扩展才能工作。

概念是这样的:

@echo off
setlocal EnableDelayedExpansion

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

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

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

@echo off

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

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

  • 首先,echo之后的%%被单个%取代;
  • 其次,%result%被展开,即被其值4所取代;
  • 第三,最后一个 %% 被替换为单个 %;
  • 最后,命令行echo %myString:~4%被传递给call打开的新cmd实例,因此显示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!