找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 40134|回复: 15

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

[复制链接]
发表于 2009-10-12 18:41:47 | 显示全部楼层 |阅读模式
『楼 主』: 【挑战】替换*=为指定字符的bat代码

在bat中

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

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

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

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

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

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

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

评分

参与人数 1PB +30 +1 收起 理由
netbenton + 30 + 1 好贴!

查看全部评分

 楼主| 发表于 2009-10-12 19:14:20 | 显示全部楼层
谁能解决,我以后在论坛称谁为


         擂王

[ 本帖最后由 plp626 于 2009-10-12 19:15 编辑 ]
发表于 2009-10-12 19:22:09 | 显示全部楼层

回复 2楼 的帖子

大家都是这么想的~~
发表于 2009-10-12 19:28:36 | 显示全部楼层
还有2个字符:~!

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

评分

参与人数 1PB +6 收起 理由
plp626 + 6 确实,心有灵犀啊

查看全部评分

 楼主| 发表于 2009-10-12 19:32:10 | 显示全部楼层
我先说下,如果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赋值的代码,那么则是质的飞跃
但是这得大家挖掘预处理机制,对^!%充分利用
发表于 2009-10-12 19:56:31 | 显示全部楼层
抛砖引玉!
  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
复制代码

评分

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

查看全部评分

发表于 2009-10-12 20:44:32 | 显示全部楼层

回复 4楼 的帖子

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


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

[ 本帖最后由 523066680 于 2009-10-12 20:46 编辑 ]
发表于 2009-10-12 22:56:29 | 显示全部楼层
我发一个无聊点的版本上来...
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
复制代码
发表于 2009-10-12 23:19:36 | 显示全部楼层

回复 7楼 的帖子

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

当考虑所有特殊字符时,肯定是要开启变量延迟的。
发表于 2009-10-18 02:37:45 | 显示全部楼层
小弟上个月写过类似的东西,是可以改文件的
所以由读取外部文件下手
先存一個  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 编辑 ]
发表于 2009-10-18 13:08:23 | 显示全部楼层
群里有人讨论sed,我贴一下:
C:\Test>type a.txt
:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

C:\Test>sed -e "s/\*/星星/g"  -e "s/=/等号/g" a.txt
:星星/星星\星星星星,.等号星星,...等号///&+wodfdfd星星星星等号等号...星星星星星星星星星星星星星星星
星星星星星星星星星星星星星星星等号等号等号等号等号等号等号等号等号等号...
 楼主| 发表于 2009-10-27 21:41:48 | 显示全部楼层
原帖由 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 编辑 ]
发表于 2009-11-27 01:23:56 | 显示全部楼层
只能说特殊字符是批处理的痛!!!

[ 本帖最后由 batman 于 2009-11-27 01:26 编辑 ]
发表于 2010-3-30 11:28:11 | 显示全部楼层
12楼那个代码,如果有个:,可能就麻烦了
发表于 2010-4-12 18:10:56 | 显示全部楼层
我真的好想把它做出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:09 , Processed in 0.025738 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表