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

【挑战】替换*=为指定字符的批处理代码

『楼 主』: 【挑战】替换*=为指定字符的bat代码

在bat中

goto,call语句是确实比较耗时;http://bbs.bathome.net/thread-5993-1-1.html

若*,=的替换问题解决了

几乎可将所有代码的goto循环转换为for循环

现在征集最简洁最快速的代码,【当然不能含有goto或call命令了】

测试字符串:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

将*替换为星星
将=替换为等号

有挑战者请上擂台。。。,
1

评分人数

谁能解决,我以后在论坛称谁为


         擂王

[ 本帖最后由 plp626 于 2009-10-12 19:15 编辑 ]

TOP

回复 2楼 的帖子

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

TOP

还有2个字符:~!

[ 本帖最后由 zqz0012005 于 2009-10-12 19:31 编辑 ]
1

评分人数

    • plp626: 确实,心有灵犀啊PB + 6
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我先说下,如果if 逐一判断字符,那么势必要先确定字符串的长度,这个花费时间在3.5个时间单位,
【1个时间单位规定为1个set赋值所耗费的时间】
然后if 判断,但是
预处理一个for ..或 if .. 或 else ... 相当于0.5~0.6个set命令的花费时间
对于一个120个字符串长度的代码至少要耗费3.5+120*0.6=75+个时间单位
所以这个并不是很理想的代码,【当然要比goto的方法快N倍】

如果有直接set赋值的代码,那么则是质的飞跃
但是这得大家挖掘预处理机制,对^!%充分利用

TOP

抛砖引玉!
  1. @echo off
  2. set @*=星
  3. set @:=帽
  4. set "@~=眉"
  5. set "@=叹"
  6. set cr=^
  7. set "str=测试字符串:*/*\**,.=*,...=///&+wodfdfd**~~!!==...**:::::*************==========..."
  8. setlocal enabledelayedexpansion
  9. set ti=%time%
  10. for /l %%a in (0,1,100) do (
  11. for /f %%b in ("!str:~%%a,1!") do (
  12. if defined @%%b (
  13. set s=!s!!@%%b!
  14. ) else (
  15. if "%%b" equ "=" (set s=!s!等) else (set s=!s!%%b)
  16. )
  17. set n=%%a
  18. )
  19. )
  20. echo !s!!cr!
  21. echo 原串有:!n!个字符!cr!
  22. call :etime !ti! !time! ab
  23. echo 用时:!ab!毫秒!cr!
  24. pause
  25. :etime <begin_time> <end_time> <return> by plp626 on bathome
  26. rem 所测试任务的执行时间不超过1天 // 骨瘦如柴版
  27. setlocal&set be=%~1:%~2&set cc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c&set dy=-8640000
  28. for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>>31")&exit/b
复制代码
3

评分人数

    • 尘丶: 学习了技术 + 1
    • wankoilz: 学习了,充分利用了!!和%%b容纳特殊字符的特 ...PB + 3
    • plp626: 谢谢参与,不过现在还不能叫你擂王PB + 6

TOP

回复 4楼 的帖子

额,那个,  
1、还有^ 的 而且当^在最后面,又没有双引号,
就会变成连接下一句,
2、还有奇数个双引号~


这个信息是给4楼的内容添加的。

[ 本帖最后由 523066680 于 2009-10-12 20:46 编辑 ]

TOP

我发一个无聊点的版本上来...
debug不会用...
  1. @echo off & setlocal EnableDelayedExpansion
  2. echo "*/*\**,.=*,...=///&+wodfdfd**==...***************==========...">1.txt
  3. for /f "tokens=* " %%i in ("1.txt") do set "Size=%%~zi"
  4. for /l %%i in (1,1,%size%) do set "wen=!wen!@"
  5. echo !wen!>2.txt
  6. if exist 3.txt del 3.txt
  7. for /f "skip=1 tokens=1,2,3 " %%i in ('fc /b 1.txt 2.txt') do echo %%j>>3.txt
  8. for /f "tokens=* " %%i in (3.txt) do set "out=!out!%%i "
  9. set "out=%out:22=31%"
  10. set "out=%out:3D=32%"
  11. set "out=%out:26=33%"
  12. set "out=%out:2F=34%"
  13. set "out=%out:2.txt=%"
  14. set /a "x=%size% / 16"
  15. set /a "y=100"
  16. echo @echo off>1.cmd
  17. echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>1.cmd
  18. echo copy/b/y $tmp$ "a.txt"^>nul>>1.cmd
  19. echo del/a/f/q $tmp$>>1.cmd
  20. echo goto:eof>>1.cmd
  21. for /l %%i in (1,1,%x%) do (
  22.         echo e0!y! !out:~0,48!>>1.cmd
  23.         set "out=!out:~48!"
  24.         set /a "y=!y!+10"
  25.         )
  26.         echo e0!y! !out!>>1.cmd
  27. echo rcx>>1.cmd
  28. echo !y!>>1.cmd
  29. echo n$tmp$>>1.cmd
  30. echo w>>1.cmd
  31. echo q>>1.cmd
  32. start "" "1.cmd"
  33. for /f "tokens=* " %%i in (a.txt) do if not defined a set "a=%%i"
  34. echo 字符串%a%
  35. pause
复制代码

TOP

回复 7楼 的帖子

你说的那几个在开启变量延迟后不存在问题。

当考虑所有特殊字符时,肯定是要开启变量延迟的。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

小弟上个月写过类似的东西,是可以改文件的
所以由读取外部文件下手
先存一個  test.txt  ,  內容為
  1. */*\**,.=*,...=///&+wodfdfd**==...***************==========...
复制代码
然後運行
  1. @echo off
  2. for /f "delims=" %%a in ('type test.txt') do (call :_1 "%%a")
  3. :_1
  4. setlocal enabledelayedexpansion
  5. set "word=%~1"
  6. if not defined word (echo !fix_word! & pause & exit)
  7. if "!word:~0,1!"=="*" (set fix_word=!fix_word!* & call :_1 "!word:~1!") else (
  8. if "!word:~0,1!"=="=" (set fix_word=!fix_word!= & call :_1 "!word:~1!") else (
  9. set "fix_word=!fix_word!!word:~0,1!" & call :_1 "!word:~1!") )
复制代码
突然看到...不能有call....
可能嗎 = =a?
~_~好像不是很理想的方法.....

[ 本帖最后由 strong12345 于 2009-10-18 08:13 编辑 ]

TOP

群里有人讨论sed,我贴一下:
C:\Test>type a.txt
:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

C:\Test>sed -e "s/\*/星星/g"  -e "s/=/等号/g" a.txt
:星星/星星\星星星星,.等号星星,...等号///&+wodfdfd星星星星等号等号...星星星星星星星星星星星星星星星
星星星星星星星星星星星星星星星等号等号等号等号等号等号等号等号等号等号...

TOP

原帖由 HAT 于 2009-10-18 13:08 发表
群里有人讨论sed,我贴一下:
C:\Test>type a.txt
:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

C:\Test>sed -e "s/\*/星星/g"  -e "s/=/等号/g" a.txt
:星星/星星\星星星星,.等号星星 ...


如果用sed我也不会提出这个问题了


本贴为cmd技术探讨而发帖

http://www.cn-dos.net/forum/viewthread.php?tid=49028&fpage=4
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=*/*\**,.=*,...=///&+wodfdfd**==...***************==========..."
  3. set ss=&for /l %%a in (0 1 120)do if "!str:~%%a,1!"=="*" (set "ss=!ss!*") else if "!str:~%%a,1!"=="=" (set "ss=!ss!﹦") else if "!str:~%%a,1!" neq "" set "ss=!ss!!str:~%%a,1!"
  4. echo !ss!&pause
复制代码
这个是那边联盟的代码,综合简洁+效率,目前也就只能这样

但我始终没有放弃"一招致死"的代码,雷王的位子还在,等待高人去占

[ 本帖最后由 plp626 于 2009-10-27 21:44 编辑 ]

TOP

只能说特殊字符是批处理的痛!!!

[ 本帖最后由 batman 于 2009-11-27 01:26 编辑 ]
***共同提高***

TOP

12楼那个代码,如果有个:,可能就麻烦了

TOP

我真的好想把它做出来
@echo off
set /p=>hlw1.txt<nul

TOP

返回列表