SETLOCAL EnableDelayedExpansion
SET str=123456789abcdefgh
FOR /l %%x IN (1, 1, 10) DO (
SET /a intLength=10-%%x
SET result=!str:~-%%x!
ECHO "Works as intended: " !result!
SET result=!str:~-intLength!
ECHO "Does NOT work as intended: " !result!
)
endlocal
最佳答案
您使用的是文本字符串intLength
而不是%intLength%
变量。
由于要在for循环内初始化变量,因此必须使用此变量名的!intLength!
变体。不幸的是,由于您已经在使用感叹号从str
中获取子字符串,因此不能在该行中也使用它们来获取intLength
的值,因为您实际上拥有一个变量!str:~!
,一个批处理实际上不喜欢的无关字符串,以及一个!!
。
您可以通过在另一个for循环中运行!intLength!
并改用%%var
变量来解决这个问题,因为您已经展示了这一点。
@echo off
setlocal EnableDelayedExpansion
set str=123456789abcdefgh
for /l %%x in (1, 1, 10) DO (
set /a intLength=10-%%x
SET result=!str:~-%%x!
echo Works as intended: !result!
for /f %%A in ("!intLength!") do SET result=!str:~-%%A!
echo Now works as intended: !result!
echo.
)
endlocal
关于windows - 子字符串操作中的延迟变量扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31909019/