看着楼主很无助的样子,解惑一把:
整个for语句被视为一完整的命令,而这条命令中所有的%a%或%b%的真实值均为它前一条命令(set str=123456)执行结束时的值,即在整个for循环的过程中,%a%始终为0,%b%始终为空值,因而ax的值始终为!str:~0,1!(即1),bx的值始终为!str:~,1!(即1),所以会得到如下结果:- a=0 b=1 ax=1 bx=1
- a=1 b=2 ax=1 bx=1
- a=2 b=3 ax=1 bx=1
- a=3 b=4 ax=1 bx=1
- a=4 b=5 ax=1 bx=1
- a=5 b=6 ax=1 bx=1
- a=6 b=7 ax=1 bx=1
复制代码 要获得for循环执行过程中a或b的实时值,需要在开启变量延时的情况下(setlocal enabledelayedexpansion)使用!a!和!b!,
想必楼主也想到了,楼主可能尝试过:- set ax=!str:~!a!,1!
- set bx=!str:~!b!,1!
复制代码 但是因为内层变量和外层变量均用!引用,内外优先级一样,同样无法得到正确结果,结果为:- a=0 b=1 ax=123456a bx=123456b
- a=1 b=2 ax=123456a bx=123456b
- a=2 b=3 ax=123456a bx=123456b
- a=3 b=4 ax=123456a bx=123456b
- a=4 b=5 ax=123456a bx=123456b
- a=5 b=6 ax=123456a bx=123456b
- a=6 b=7 ax=123456a bx=123456b
复制代码 因为!会找离自己最近的!配对,set ax=!str!a(:~后无有用参数,截取失效,!,1!因为没定义过,所以为空)。
解决办法:
1.用更高优先级的形式来引用a,b的值:- @echo off&setlocal enabledelayedexpansion
- set a=0
- set str=123456
- for /l %%a in (%a%,1,4) do (
- set /a b=!a!+1
- for %%i in (!a!) do set ax=!str:~%%i,1!
- for %%j in (!b!) do set bx=!str:~%%j,1!
- echo a=!a! b=!b! ax=!ax! bx=!bx!
- set /a a=!a!+1
- )
- pause
复制代码 2.运用call的二次预处理:- @echo off&setlocal enabledelayedexpansion
- set a=0
- set str=123456
- for /l %%a in (%a%,1,4) do (
- set /a b=!a!+1
- call,set ax=%%str:~!a!,1%%
- call,set bx=%%str:~!b!,1%%
- echo a=!a! b=!b! ax=!ax! bx=!bx!
- set /a a=!a!+1
- )
- pause
复制代码
|