[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
第一题:(加满分也不多,呵呵!)
  1. @echo off&setlocal enabledelayedexpansion
  2. set ``=%%
  3. set "str=abdefg ABDEFG kmli KMLI socsd SOCSD pdxy PDXY nq NQ"
  4. 1:>a.txt
  5. :lp
  6. set/a n+=1&set com=
  7. for /l %%a in (1,1,10) do (set/a r=!random!%%10&set "com=!com!!``!!r!")
  8. for /f "tokens=1-10" %%0 in ("%str%") do (echo.%com%>>a.txt)
  9. if %n% lss 10 goto :lp
  10. start a.txt
  11. pause
复制代码

[ 本帖最后由 netbenton 于 2009-4-24 01:50 编辑 ]
1

评分人数

TOP

第二题:(能处理特殊字符:><!%:;"都可以)
  1. @echo off
  2. set so=ABDEFG
  3. set de=bathome
  4. (for /f "tokens=*" %%a in (a.txt) do (
  5.         set str=%%a
  6.         setlocal enabledelayedexpansion
  7.         call :sub
  8.         endlocal
  9. ))>b.txt
  10. start b.txt
  11. pause
  12. goto :eof
  13. :sub
  14. set "cs=!str:*%so%=!"
  15. if "!cs!"=="!str!" (
  16.         if !str!==$$ set str=
  17.         if defined ok (echo !ok!!str!) else (echo !str!)
  18.         goto :eof
  19. )
  20. set "cr=!str:%so%%cs%=!"
  21. if not defined cs set cs=$$
  22. set "``=!str:%cs%=!"
  23. if not defined cr set cr=$$
  24. if "!``:%cr%=!"=="%so%" set ``=!``:%so%=%de%!
  25. set ok=!ok!!``!
  26. set str=!cs!
  27. goto :sub
复制代码

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

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

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

返回列表