如何获取变量中的变量(%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!
。
我正在尝试获取用户输入的字符串,然后让文本滚动。
我目前拥有的:
@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!
。