[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 随风 于 2009-4-23 06:20 发表
牛!
set out=%str: =!!% 好晦涩的写法 不仅使我想起了 %var:*"=set "var=%
它们是兄弟吧 ^_^
百思不得其解 set out=%str: =!!% 这句是如何替换的?能讲解下吗?
你好像少写了个空格 (set "str=!str! !ram:~%%a ...


多谢指出。没注意的确少了个空格,
set out=%str: =!!% 这句是把数字变为变量。
如1 2 3 4 5 6替换为!!1!!2!!3!!4!!5!! 前边已把定义过1~0 为变量为10个字串了,所以输出就是它们的随机组合

学批处理还不到一月,还有很多东西要向各位老大学习

TOP

回复 18楼 的帖子

多谢,原来就是把空格替换为 !! 号啊,汗,想多了,反而把最基础的搞忘了。。。
这样也可以
  1. for /l %%a in (1,1,10) do (set "str=!str! ^!!ram:~%%a,1!^!")
  2. echo %str%
复制代码

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

TOP

第二题,终于能兼容特殊字符,还真是费了番脑筋
  1. @echo off
  2. set str=ABDEFG
  3. set dst=bathome
  4. for /f "delims=" %%i in ('findstr /n .* 12.txt') do (
  5.     set "var=%%i"
  6.     setlocal enabledelayedexpansion
  7.     set var=!var:*:=!
  8.     if defined var (
  9.         set var=!var!//巭//
  10.         set "result="
  11.         call :loop
  12.         echo !result:~,-5!
  13.     ) else echo.!var!
  14.     endlocal
  15. )
  16. pause&exit/b
  17. :loop
  18. set tail=!var:*%str%=!
  19. if "!tail!"=="!var!" (set result=!result!!tail!&goto :eof)
  20. rem set head=!var:%tail%=!
  21. rem 这里用%tail%会导致无法兼容特殊字符
  22. for /f "delims=" %%a in ("!tail!") do set head=!var:%%a=!
  23. rem 上面用for变量中介,虽然开启了变量延迟但即使变量tail中含有感叹号也不影响。
  24. set left=!head:%str%=!
  25. if "!left!%str%"=="!head!" (set result=!result!!left!%dst%) else set result=!result!!head!
  26. set var=!tail!
  27. goto loop
复制代码
1

评分人数

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

TOP

我也来试试

第二题代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/p var1=请输入要查找的内容:
  4. set/p var2=请输入要替换的内容:
  5. :len
  6. if not "!var1:~%num1%,1!"=="" (set/a num1+=1&goto :len)
  7. for /f "delims=" %%a in (a.txt) do (
  8. set str=%%a
  9. set/a num+=1
  10. call :replace !str! !num1!
  11. )
  12. pause
  13. goto :eof
  14. :replace
  15. set ss=%1
  16. set/a n=0
  17. :a
  18. set/a m=%n%+%2
  19. if not "!ss:~%n%,1!"=="" (
  20. if "!ss:~%n%,%2!"=="!var1!" (
  21. set ss=!ss:~0,%n%!!var2!!ss:~%m%!
  22. set/a n+=1
  23. goto :a
  24. ) else (set/a n+=1&goto:a)
  25. ) else (echo !ss!>>aa.txt)
复制代码

[ 本帖最后由 sjzong 于 2009-4-24 11:47 编辑 ]
1

评分人数

    • batman: 不通用,效率也不高PB + 10

TOP

第一题

  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>test.txt
  3. set BIG=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  4. set a=1
  5. set b=1
  6. :for
  7. set /a n=%RANDOM%%%5
  8. set /a n+=1
  9. for /f "tokens=%n%" %%I in ("abdefg kmli socsd pdxy nq") do (set var=%%I)
  10. set /a m=%RANDOM%%%2
  11. if %m% EQU 1 (for %%i in (%BIG%) do (set var=!var:%%i=%%i!))
  12. set /p var=!var! <nul>>test.txt
  13. set /a a+=1
  14. if %a% GTR 10 (echo.>>test.txt&goto end) else goto for
  15. :end
  16. set /a b+=1
  17. if %b% GTR 10 (goto exit) else set a=1&goto for
  18. :exit
  19. exit
复制代码

[ 本帖最后由 czq19731102 于 2009-4-23 21:06 编辑 ]
1

评分人数

TOP

回复 21楼 的帖子

ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
把这行放进去试试
技术问题请到论坛发帖求助!

TOP

回 23楼 的帖子

对了,你说的我已经试过了,可以的!这边有个问题:就是我的这批处理中是已经知道a.txt有十行,所以,我这边直接if !num!==10 goto :b 用来判断是否结束!

如果你把你说的那一行放在a.txt的最后一行,就不能显示了,因为已经是十一行,所以就没有结果!

我还是改过来!用for语句来直接判断a.txt的行数了!!

[ 本帖最后由 sjzong 于 2009-4-23 15:56 编辑 ]

TOP

我在题目中选取ABDEFG来做替换字符是只是为了举例,并不一定总是拿ABDEFG替换为
bathome,所以请大家在解答时还是要注意下代码的通用性,另不要考虑特殊字符。。。
***共同提高***

TOP

回复 24楼 的帖子

你确定你21楼的代码可以?
a.txt 就一行内容
ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG
把 ABDEFG 替换为 ------
结果如下:
------ABDEFGabdefgabdefgabdefg------ABDEFG------
技术问题请到论坛发帖求助!

TOP

回复 18楼 的帖子

哇!不到一月就这么厉害了啊!
好另类的思维模式啊!不看作者解说,还真没想到他是这么想的,学习了

[ 本帖最后由 czq19731102 于 2009-4-23 23:02 编辑 ]

TOP

第一题:(加满分也不多,呵呵!)
  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

netbenton兄的代码真是出神入化呀。在cn-dos 见识过您的功力

TOP

回复 28楼 的帖子

呵呵,多谢支持。
一月前我也还真不明白tokens delims是代表什么意思。刚好手头有一个任务要做。想了很多办法也没弄好。一不小心,百度到了cn-dos 及本坛。刚好坛上有个例子解决我的问题。但是看了各位老大的代码真是云里雾里的。于是我很强烈地想弄明白这些代码到底是怎么回事。学了几个有限的命令之后,越来越感到这些东西不断地在挑战我的脑细胞。
我觉得把自己的思路用p来实现是一件很爽很有成熟感的事情,我还有很多东西要学。
大家一起努力吧

TOP

回复 30楼 的帖子

29楼解的第一题与15楼思路相近,只是最后一个for没看明白,%%0这里必须是0才行,不知道为什么,不理解这个for的运作原理。
1:>a.txt 比 cd.>a.txt 只相差一个字符,却会出现错误提示,不知为何非要这样写?
难道是为了有意晦涩?

30楼 首先解题考虑不周,与21楼犯同样错误,
对 ABDEFGABDEFGabdefgabdefgabdefgABDEFGABDEFGABDEFG 字符串不能准确替换。
其次,效率不够高,也许是为了兼容特殊字符吧(未作详细测试)
总的来说效率还算过得去。
技术问题请到论坛发帖求助!

TOP

返回列表