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

回复 30楼 的帖子

看到有set "cr=!str:%so%%cs%=!"
使用了%cs%就注定无法完全兼容特殊字符。
试试加入一行:"ABDEFG"(带上引号)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 33楼 的帖子

29 30 楼这两段代码都看得很费力。
第一段觉得1:>a.txt 不要的可以。不清楚有什么用。是类似于type nul>a.txt ?
最后的for %%0 看明白了,是为配合com变量作显示。%com%值经上一步实际是
%%6%%4%%1%%2%%1%%8%%2%%3%%5%%7 所以前边必须用%%0作配合。
变成下边这样了。
for /f "tokens=1-10" %%0 in ("%str%") do (echo.%%6%%4%%1%%2%%1%%8%%2%%3%%5%%7)  思路跟我相近。

30楼的替换测试正常(特殊字符没测试)
ok ‘’两个变量最好初始化一下set "ok="&set "``=", 否则多次运行有变量残留。
思路是用变量层层替换法取出ABDEFG循环替换后输出,

!str:*a=! 此处*的作用很大。我是第一次学习到。
它的作用是只取str 中第一个匹配对象后边的字符。抛弃前边的字符
E:\bat>set aa=abcde
E:\bat>echo %aa:*c=%
de
E:\bat>echo %aa:c=%
abde
高手见笑了。还有个问题,就是如何才可以在最短时间内看明白代码的思路?
去掉@echo off ? 很乱哦。加echo !XX! &pause吗?。有好方法请指点一下。

[ 本帖最后由 inittab 于 2009-4-24 09:28 编辑 ]

TOP

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

看来大家都很积极,这确实是一个好现象,现给出本人第一题的解(第二题由于没有新思
路暂不公布):
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>a.txt
  3. set "str=abdefg kmli socsd pdxy nq ABDEFG KMLI SOCSD PDXY NQ"
  4. for /l %%a in (1,1,100) do (
  5.      set /a a=!random!%%10+1,b=%%a%%10&call :lp
  6.      if !b! equ 0 echo.>>a.txt
  7. )
  8. start a.txt&goto :eof
  9. :lp
  10. for /f "tokens=%a%" %%a in ("%str%") do set /p=%%a<nul>>a.txt
复制代码

[ 本帖最后由 batman 于 2009-4-24 11:37 编辑 ]
***共同提高***

TOP

1:>a.txt指在产生一个空文件,出错提示,不会有任何影响,
这个说明了1:是可以作为盘符的,如果存在。刚看了别人的多种产生临时文件的方法,所以就试一下,没别的什么意思。
ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
和“”
不能正确的问题确实没有考虑到。回头再想想,

TOP

两个问题都解决了

用加尾巴,最后再丢弃,解决不能正确替换问题
用单个引号转为两个引号(用变量代入法才做到),最后再换回来。解决双引号错误问题
  1. @echo off
  2. set so=ABDEFG
  3. set de=bathome
  4. set @="
  5. set @@=""
  6. (for /f "tokens=*" %%a in (a.txt) do (
  7. set str=%%a#批处理#&setlocal enabledelayedexpansion
  8. set "str=!str:%@%=%@@%!"
  9. call :sub
  10. endlocal
  11. ))>b.txt
  12. start b.txt
  13. pause
  14. goto :eof
  15. :sub
  16. set "cs=!str:*%so%=!"
  17. if "!cs!"=="!str!" (
  18. set ok=!ok!!str!
  19. set "ok=!ok:%@@%=%@%!"
  20. echo !ok:~,-5!
  21. goto :eof
  22. )
  23. set "cr=!str:%so%%cs%=!"
  24. set "``=!str:%cs%=!"
  25. if defined cr set "``=!``:%cr%=!"
  26. if "!``!"=="%so%" set ``=%de%
  27. set ok=!ok!!cr!!``!
  28. set str=!cs!
  29. goto :sub
复制代码
这种方法,偶认为肯定比用findstr要高效。

[ 本帖最后由 netbenton 于 2009-4-24 13:54 编辑 ]

TOP

回复 36楼 的帖子

多谢zqz001205的链接,预处理一直是一道我无法迈入的门槛,看来看去总是晕晕沉沉的。
但此题我的疑问和预处理好像没什么太大关系,不过看帖的时候却突然灵光一现茅塞顿开。
我知道经过第一个for后com变成了%%6%%4%%1%%2%%1%%8%%2%%3 样字串,
只是没明白for /f "tokens=1-10" %%0 这里取 1-10 的用意,当然也就搞不清 %%0 的作用了。
原来如此简单。。。
汗! 一个主题帖中居然两次对初级问题犯迷糊,惭愧。。。

[ 本帖最后由 随风 于 2009-4-24 15:57 编辑 ]
技术问题请到论坛发帖求助!

TOP

回复 39楼 的帖子

特殊字符是cmd的软肋,无论怎么考虑都很难考虑周全,增加代码量不说对运行效率也有一定影响,
所以一般写bat代码通常不用兼容特殊字符(或是根据实际情况针对性的兼容),
当然若在不明显影响效率的情况下是兼容的越多越好
楼主之所以声明不用考虑特殊字符的原因我想应该也是如此吧
你39楼的代码,再给你下面两个字符串试试?看看都替换成了什么。
ABDEFG!%^@#!ABDEFG!abdefgabdefgabdefgABDEFG
ABDEFG!%^@#!ABDEFGabdefgabdefgabdefgABDEFG
技术问题请到论坛发帖求助!

TOP

回复 40楼 的帖子

这样的用法虽然技术原理没有什么不同,但确有新意。
首先一般不易想到%%0是for的变量(帮助中提到的都是字母形式),如果不是以前对这种形式有所接触,刚见到它时我也觉得可能有问题。
其次是echo.%com%>>a.txt,并不是像echo %%0、%%1那样显式地出现for的变量,必要经过预处理,进行变量展开后才变成%6%4%1%2%1%8%2%3(注意不是%%而是%,因为变量``的值是%) 之类的字串。这样非显式出现使得%%0的作用更难弄清楚。而对于tokens=1-10,指定变量%0之后的变量引用是%1、%2等依次递增的数字(for的变量其实是%i的形式,bat中写成%%i是为了预处理),它们是隐式出现于%com%中。

在这个问题上犯迷糊很正常,没有相关水平连迷糊都犯不上(干脆不懂),实在是有新意。

[ 本帖最后由 zqz0012005 于 2009-4-24 17:07 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

对for中变量的用法,大家有兴趣的可以看看此贴的七楼这段代码(可别晕了哦)。。。。
http://bbs.bathome.net/viewthrea ... hlight=%C1%B7%CF%B0
***共同提高***

TOP

第一题

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "var=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
  4. set/a n=0
  5. for %%i in (%var%) do (set !n!=%%i&set/a n+=1)
  6. cd.>a.txt
  7. set/a m=0
  8. :a
  9. if !m! lss 10 (
  10. set/a n=0
  11. set str=
  12. :b
  13. set/a s=%random%%%10
  14. set str=!str!!%s%!
  15. if !n!==9 (
  16. echo !str!>>a.txt
  17. set/a m+=1
  18. goto :a) else (set/a n+=1&goto :b)
  19. )
  20. start a.txt
  21. pause
复制代码

[ 本帖最后由 sjzong 于 2009-4-25 00:10 编辑 ]

TOP

回复 42楼 的帖子

新意确实有,但这和预处理好像相关不大,
你说“echo.%com%>>a.txt,并不是像echo %%0、%%1那样显式地出现for的变量,必要经过预处理”
我不这么认为,其实预处理应该在set "com=!com!!``!!r!" 的时候就已经处理了,这应该也是
作者为什么要 set ``=两个%% 而不= 一个 % 号的原因吧。
我认为,其实 echo.%com%>>a.txt 就是和 echo %%0 %%1 %%2 %%3 ..... 是一样的,
只不过这里的数字不是按顺序排列的而是通过前面得到的随机数0-9 ,
而%%0 就是为了保证后面的   %%+数字 能够正确显示,
就象我们要  echo %%b 前面就要定义 %%a 是一个道理。
for 用数字作变量,一直都知道,但始终认为它容易和批处理的参数搞混,
所以个人一直不提倡这种用法,只是没想到在这里却发挥了它的独到作用。
15楼的也是如此。
技术问题请到论坛发帖求助!

TOP

预处理并非一次性处理完毕,而是边执行边处理。
set "com=!com!!``!!r!"
这个语句基本上不需要“预处理”做什么,设置变量com是语句中的命令完成的。
set ``=%%
预处理时将两个%%号变成一个,然后才是set赋值,所以变量``的值是一个%
“我认为,其实 echo.%com%>>a.txt 就是和 echo %%0 %%1 %%2 %%3 ..... 是一样的”
在预处理之前,形式上明显不同。预处理后,前者是%6%4%1%...(预处理对变量com进行展开的结果),此时才出现%n(如果对com不赋予这样的值,就没有for变量%1、%2等,所以说是隐式的),后者直接是echo %1 %2 %3...。预处理后两者才是一样。

可能是大家对“预处理”这个词的理解不一样,但只要明白语句的执行方式,不管怎么理解都一样,毕竟没有官方说法。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

re 随风

偶认为echo.%com%>>a.txt是预处理。
同一组数据里面只对%号进行一次替换和减半操作,(加call 后面算是组外的了)
而for 令牌,本来就是只用一个%号的,只要经预处理后形成合适的参数形式,for运行时就会进行取值替换。
如:set  `=%%
for /f "tokens=1,2,3" %%a in ("aa bb cc") do (echo %`%a %`%b %`%c)
一样能正确执行。

其实com的值是%0%1%3。。。而不是:%%0%%1%%3
可用set com查看就知道了。

谢谢测试,确实不能处理所有的特殊字符,君的方法好像处理格时也会出问题。

[ 本帖最后由 netbenton 于 2009-4-24 22:34 编辑 ]

TOP

第一题,换种方法
  1. @echo off&setlocal enabledelayedexpansion
  2. set "sou=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
  3. (for %%a in (%sou%) do (
  4. set des=
  5. for %%b in (%sou%) do (
  6.   set str= %sou%
  7.   set/a a=!random!%%11
  8.   for /l %%c in (0,1,!a!) do (set str=!str:* =!)
  9.   for /f %%d in ("!str!") do set des=!des!%%d
  10. )
  11. echo !des!
  12. ))>a.txt
  13. start a.txt
  14. pause
复制代码

TOP

返回列表