我试图获取用户输入的字符串,然后让文本滚动。
到目前为止我所拥有的:
@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(听起来很奇怪,但我认为你可以想象我的意思)。
答案 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!
。