标题: [数值计算] 字符串循环提取的批处理为何始终达不到理想的效果? [打印本页]
作者: 咒夜坠 时间: 2012-6-16 11:48 标题: 字符串循环提取的批处理为何始终达不到理想的效果?
- @echo off&setlocal enabledelayedexpansion
- set a=0
- set str=123456
- for /l %%a in (%a%,1,6) do (
-
- set /a b=!a!+1
- set ax=!str:~%a%,1!
- set bx=!str:~%b%,1!
- echo a=!a! b=!b! ax=!ax! bx=!bx!
- set /a a=!a!+1
- )
- pause
复制代码
想得到效果
0 1 1 2
1 2 2 3
2 3 3 4
4 5 5 6
作者: CrLf 时间: 2012-6-16 12:06
- @echo off&setlocal enabledelayedexpansion
- set test=0123456
- for /l %%a in (0 1 6) do set test=!test:%%a=%%a %%a !
- for /l %%a in (2 4 16) do echo !test:~%%a,8!
- pause
复制代码
作者: weichenxiehou 时间: 2012-6-16 16:30
看着楼主很无助的样子,解惑一把:
整个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
复制代码
作者: yangfengoo 时间: 2012-6-16 17:14
- @echo off&setlocal enabledelayedexpansion
- set str=0123456
- for /l %%a in (0,1,4) do set #=!str:~%%a,3!&echo,!#:~,2!!#:~-2!
- pause
复制代码
作者: poter 时间: 2012-6-18 21:17
这样才对~~
@echo off&setlocal enabledelayedexpansion
set a=0
set str=123456
for /l %%a in (%a%,1,6) 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
作者: forfiles 时间: 2012-6-18 23:34
回复 5# poter
请问2、3、4楼的错误分别在哪里?
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |