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

[其他] [已解决]批处理如何实现遍历一个未知类型的变量的每一位?

如有下列代码:
  1. set /p s=请输入:
复制代码
然后我想遍历变量s的每一位然后做一些操作,
比如将每一位逆序输出,
再比如正序输出每一位,但是每位之间要用逗号分割开,
请问各位前辈应该怎么实现呢?
多谢了。。。

[ 本帖最后由 fish 于 2010-8-3 21:54 编辑 ]

  1. @echo off & setlocal enableDelayedExpansion
  2. set testStr=asdfghjk987654
  3. set testStr
  4. call :printReverse testStr & echo.
  5. call :printDev testStr 0 & (echo  )
  6. pause
  7. exit /b
  8. :printReverse
  9. setlocal
  10. if "!%1!" leq "" exit /b
  11. set tt=!%1!
  12. set /p=!tt:~-1!<nul
  13. set tt=!tt:~,-1!
  14. call :printReverse tt
  15. exit /b
  16. :printDev str pt
  17. setlocal
  18. if "!%1:~%2,1!" leq "" exit /b
  19. set /p=!%1:~%2,1!,<nul
  20. set /a tt=%2+1
  21. call :printDev %1 !tt!
  22. exit /b
复制代码

TOP

回复 2楼 的帖子

多谢neorobin前辈的精妙代码,算法已基本看懂,可是我还有一些细节不太清楚,求指教:
1、第一个exit的/b参数有什么用呢?晚辈以为多余。
2、为什么每个子过程里面都写上setlocal,这个是干什么用的,求详解。
3、set /p=!tt:~-1!<nul这句为什么不能写成set /p=%tt:~-1%<nul呢?(后面几句同)这里为什么要用变量延迟呢,这里也不是复合语句啊,请指点迷津。
多谢了。。。

TOP

这就是蛋疼的经典表现~哈哈~
难道这位神牛考虑了特殊字符么~?
OrzDEF

TOP

惭愧的说, 精妙 不敢当, 而且确实是没考虑特殊字符的, 有些代码写法上无必要(习惯或对有些语法理解不清晰), 或者冗余, 或者不严密.

seter 说的好, 蛋疼的精典表现. 我不是神牛, 只是想得到的就写点, 楼主并非不会, 就期待哪位真正好的代码吧

TOP

回复 5楼 的帖子

但是我是真的不会3楼的那些问题啊,请您教教我吧,多谢了。。。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. Title ....        →ψ疯行天魔Ф
  3. set Ф=asdfghjk987654
  4. set /p Ф=
  5. call :ψ %Ф%
  6. echo !SS!
  7. echo !S:~0,-1!
  8. pause
  9. set "T=%1"
  10. :X
  11. if not defined T goto :eof
  12. set S=!S!!T:~0,1!,
  13. set SS=!T:~0,1!!SS!
  14. set T=!T:~1!
  15. goto X
  16. pause
  17. exit
复制代码

TOP

2楼代码,第一个exit是为了程序能及时退出,并不多余,
否则在按下任意键后,代码又会执行下面的语句
每个子过程都写上setlocal是为了在结束时把变量清空,
但是2楼的代码没有相应的endlocal,如果变量长度超过32个话,就会发生溢出错误。
set /p=!tt:~-1!<nul在这里和set /p=%tt:~-1%<nul是一样的,你自己试试就知道了。
2楼的兄弟,能写出代码就不错,不用管别人怎么说,进步总是慢慢来的,因为我们不是从娘胎里就会写代码的。
  1. @echo off
  2. set Str=asdfghjk987654
  3. echo %str%
  4. :a
  5. set num=%str:~-1%,%num%
  6. set var=%var%%str:~-1%
  7. set str=%str:~0,-1%
  8. if defined str goto a
  9. echo %num:~0,-1%
  10. echo %var%
  11. pause
复制代码

TOP

回复 6楼 的帖子

exit 带上 /b 参数 只是我的一个习惯, 并非任何地方都有必要, 确实如你所言, 第一处就是没必要的.
同样的 !var! 的用法也只是我的习惯, 也并非任何地方都必如此, 但我从未对不需 变量延迟 的情境作过深入学习研究, 也不想花脑筋考虑哪些地方用 %var% 形式就行了, 很少的时候, 我非常明确无需 变量延迟, 可能就会采用 %var% 的形式(不一定).

对于单独的 setlocal 语句, 我也是最近才尝试使用, 暂未深入学习, 之前在 exit /b 前加入了 对应的 endlocal, 正常. 接着又删除了 endlocal, 在本例中, 仍未出错, 我就索性没再加上了. 大家知道, 在高级语言的函数或过程里, 变量默认是局部化的, 退出函数或过程时, 局部变量也会自动被回收. 这里我只是猜测 exit /b 有没这种清理局部变量的功能.  按 FOR 的说法, 大概就是没有了, 以后再花时间来学这个.

对批处理的学习, 我只是用到时才学的, 勉强应付某问题也就罢了, 我的热情仅此而已.

如果你的热情到了相当的高度, 自然而然的会一头扎进去, 也自然的会 精妙娴熟, 所谓 "好之者不如乐之者", 而我只是小有所好.

TOP

回复 7楼、8楼和9楼 的帖子

1、FOR前辈说set /p=!tt:~-1!<nul在这里和set /p=%tt:~-1%<nul是一样的,可我试后发现结果并不一样啊,请问这是为什么呢?
2、是不是说setlocal和endlocal合用实现了变量及时回收的机制呢?
3、第一个exit 的/b的确没有必要测试完毕。
4、7楼和8楼的前辈的代码中的defined用的很妙,学习了,多谢。
继续请求前辈指点中。。。

TOP

确实 if "!%1!" leq ""  这一句不能用%%来引用变量

TOP

neorobin跟我的习惯有点类似..
尽管坛子里很多高手都喜欢“一行代码”,还追求效率能不call就不call...
但我喜欢把程序过程写清楚,把子功能分离出去变成 call +exit /b 形式...

TOP

我现在想问的一个重要问题是

2楼前辈的代码中
set /p=!tt:~-1!<nul为什么不能换成set /p=%tt:~-1%<nul呢?怎么想也想不通。。。

TOP

回复 13楼 的帖子

我实测了一下, 发现 % 紧接(也就是说这两个符号之间没有任何别的东西)着 < 就不行, 但把 <nul 移到前面就可以, 如下:
  1. <nul set /p=%tt:~-1%
复制代码
至于原因, 我不知道, 楼主找找研究下吧

TOP

终于想通了,多谢各位前辈帮忙了,多谢。。。

问题已解决,多谢关注此贴的热心前辈们。。。

TOP

返回列表