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/

10-09 12:42