我复制了下面的全部文字这个答案 https://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990;我只是更改了变量的名称和特定示例以匹配此问题的名称:
%x:~12,3%
返回从 x 中第 12 个字符开始的 3 个字符
多变的。我一直试图完成的是使用变量
代替12
and 3
。比方说y=12
and z=3
.
如果你想使用另一个变量对于子字符串的位置和长度,那么您必须知道用百分比括起来的变量的值的替换是被解析的从左到右;这意味着:%x:~%y%,%z%%
不给出期望的结果,因为这意味着:显示的值x:~
变量,后跟y
,然后是值,
变量等
要解决这个问题你必须使用延迟扩张,即插入setlocal EnableDelayedExpansion
命令在开头,将子字符串变量括在百分比中,并将原始变量括在感叹号中:
setlocal EnableDelayedExpansion
set x=0123456789ABCDEF
set y=12
set z=3
set var=!x:~%y%,%z%!
您还可以使用 FOR 命令的参数作为索引:for /F "tokens=1,2" %%i in ("%y% %z%") do set var=!x:~%%i,%%j!
.
要在 FOR/IF 内的索引更改时获取子字符串的值,请将变量用双百分号括起来,并在命令前面加上call
。例如,随机显示子字符串y
0 到 12 之间的位置和长度z
:
if %some% == %test% (
set /A y=!random! %% 13
call echo %%x:~!y!,%z%%%
)
您还可以在括号外使用此方法以避免延迟扩展:
call echo %%x:~%y%,%z%%%
实现上述过程的另一种方法是使用附加的 FOR 命令通过等效的可替换参数来更改索引的延迟扩展,然后将延迟扩展用于原始变量。这个方法比之前的 CALL 运行得更快:
if %some% == %test% (
set /A y=!random! %% 13
for %%y in (!y!) do echo !x:~%%y,%z%!
)