1
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
4

1 回答 1

3

您使用的是文字字符串intLength而不是%intLength%变量。

由于您在 for 循环中初始化变量,因此您将不得不使用!intLength!此变量名称的变体。不幸的是,由于您已经使用感叹号从 中获取子字符串str,因此您也不能在该行中使用它们来获取 的值intLength,因为您实际上将拥有一个变量!str:~!,一个不相关的字符串,批次确实不是' t会喜欢,和!!

您可以通过运行!intLength!另一个 for 循环并改用该%%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
于 2015-08-09T21:53:13.877 回答