[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 字符串循环提取的批处理为何始终达不到理想的效果?

  1. @echo off&setlocal enabledelayedexpansion
  2. set a=0
  3. set str=123456
  4. for /l %%a in (%a%,1,6) do (
  5. set /a b=!a!+1
  6. set ax=!str:~%a%,1!
  7. set bx=!str:~%b%,1!
  8. echo a=!a! b=!b! ax=!ax! bx=!bx!
  9. set /a a=!a!+1
  10. )
  11. pause
复制代码
想得到效果
0 1 1 2
1 2 2 3
2 3 3 4
4 5 5 6

回复 5# poter


    请问2、3、4楼的错误分别在哪里?

TOP

这样才对~~

@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

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=0123456
  3. for /l %%a in (0,1,4) do set #=!str:~%%a,3!&echo,!#:~,2!!#:~-2!
  4. pause
复制代码

TOP

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

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set test=0123456
  3. for /l %%a in (0 1 6) do set test=!test:%%a=%%a %%a !
  4. for /l %%a in (2 4 16) do echo !test:~%%a,8!
  5. pause
复制代码

TOP

返回列表