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


    还有一点,当usebackq不犯的时候,
for /f "delims=" %%a in (""string"")do ............
预处理string时,不仅把=视作空格,像参数分割符(= 、,、;、tab)都被视作空格;

(xp系统)
SOS --- >> lllsoslll@163.com

TOP

本帖最后由 CrLf 于 2012-3-2 18:47 编辑

回复 19# lllsoslll


    测试了一下,xp 下也能替换,但是我之前没有注意到连续的多个等号确实被替换为单个空格了,嗯,看来还是只能老老实实逐字判断

TOP

回复 18# CrLf

一直以来,
    for /f "delims=" %%a in (""..........."")do ......
还有
   for /f "usebackq" ...
在xp中被认为是cmd for /f 的bug(提示找不到文件。。乱码。。);

我这里xp,你那个代码如果把.net与abc之间的等号,换成两个等号,即:
bbs.bathome.net==abc=123====ABC=@#$=test========
这个bug就犯了;

是不是win7修复了这个bug;

另外,我的这里连续的多个等号被当做一个等号替换了;
SOS --- >> lllsoslll@163.com

TOP

本帖最后由 CrLf 于 2012-3-2 17:49 编辑

回复 17# lllsoslll


    前不久写过将空格替换为几乎任意字符的高兼容性方案:
  1. @echo off
  2. set str=bbs.bathome.net=abc=123=ABC=@#$=test========
  3. rem 设置源字符串
  4. set 要替换的字符=[#]
  5. set "空="
  6. set "k= "
  7. set "t= "   ;此处引号内的内容为 t=tab制表符
  8. rem 初始化设置
  9. setlocal enabledelayedexpansion
  10. set str=!str:"=""!
  11. rem 将引号倍增,迫使所有字符均在引号对之外
  12. for %%a in (^^ ^& ^| ^( ^) ^< ^> ";" ",") do set "str=!str:%%~a=^^^%%~a!"
  13. rem 替换特殊字符
  14. endlocal&set "str=%str:!=^^!%"
  15. rem 关闭变量延迟,同时保留 str 变量
  16. set "str=%str: =!t!%"   ;此处引号内的内容为 str:tab制表符=!t!
  17. rem 分别替换制表符为变量 !t!
  18. for /f "delims=" %%a in (""%str: =!k!%"") do set str=%%~a
  19. rem 核心语句,替换空格为变量 !k! 后,利用等号在 for 中是分隔符的性质使其被预处理为空格
  20. setlocal enabledelayedexpansion
  21. set "str=!str: =%要替换的字符%!"
  22. rem 完成替换
  23. set "str=!空!%str%"
  24. rem 完成 !k!=空格、!t!=tab制表符 以及 ^ 的消隐,!空! 变量是用于在 %str% 不含 ! 号时触发二次转义
  25. set str=!str:""="!
  26. rem 引号减半,还原现场
  27. echo !str!
  28. rem 输出结果
  29. pause
复制代码
但是因为在 powerbat 的方案中,除了 = 与 ! 之外所有字符都被处理成 asc 了,所以可以这样:
  1. @echo off&setlocal enalbedelayedexpansion
  2. rem 运行环境
  3. rem [[[[[此行代表 powerbat 的方案实现代码]]]]]
  4. endlocal&set str=%str:!=33 %
  5. rem 关闭变量延迟,替换感叹号
  6. set str=%str: =space%
  7. rem 替换空格为 space
  8. for /f "delims=" %%a in (""%str%"") do set "str=%%~a"
  9. rem 替换等号为空格
  10. set str=%str: =32 %
  11. rem 替换空格(原来是等号)为 32
  12. set str=%str:space= %
  13. rem 替换 space 为空格
  14. echo %str%
  15. pause
复制代码

TOP

回复 15# CrLf


    想知道如何利用预处理把等号替换为空格
SOS --- >> lllsoslll@163.com

TOP

本帖最后由 lllsoslll 于 2012-3-2 17:06 编辑

回复 15# CrLf



恩;
只是大略消除;而且比值的思想是假定电脑配置和环境的变化,使得echo off耗时和代码耗时成正比例变化的;事实上应该不是线性关系;
姑且用近似线性关系来消除偏差;毕竟二者都是随配置提升耗时减少的,单调性一致;


因为求比值的时候,echo off是100000次;代码任务是500次;
最后给代码任务的耗时乘以200;
比值的结果后两位数都是不精确的位数;
SOS --- >> lllsoslll@163.com

TOP

回复 13# powerbat


    嗯,这应该是类似情况下循环量较小的方案,当其他所有字符都被处理为数字后,! 可以用 %str:!=33% 直接替换,而等号可以利用预处理替换为空格再替换为 61,但是虽然避免了大量的循环,定义大量变量带来的效率损失也同样是很恐怖的...


回复 14# lllsoslll


    我的方案虽然看起来效率比较高,但没有算法可言...而且按楼主给出的格式计算 echo off 与代码的效率比值在不同电脑上似乎结果不同(有趣的是,方案一是2900+,方案二的值是1400+,把之前另一台机子的结果颠倒了)

TOP

看来我的代码效率好低,是8楼的1/3
SOS --- >> lllsoslll@163.com

TOP

目前我只想到逐字查表法,将=和!之外的字符定义成变量,=和!单独处理。
1

评分人数

TOP

第一想到 VBS + BAT
纯P的效率不够撒

TOP

用 VBS+BAT?

TOP

我不是来唱反调的,我就是想问一下研究是不是要和实用性挂上钩才是王道?
***共同提高***

TOP

个人感觉纯内部命令方案的循环量太大,无法用变量替换简化,而且受所需兼容的范围影响太严重,故而没打算往那个方向去考虑。

换了一个方案,只用一个外部命令,不过结果反而更慢了...
\w范围:
一次任务与一次“@echo off命令”耗时比=2944
可打印字符范围:
一次任务与一次“@echo off命令”耗时比=3094

TOP

版本二:
一次任务与一次“@echo off命令”耗时比=1571
一次任务与一次“@echo off命令”耗时比=1463
用了外部命令...

TOP

本帖最后由 lllsoslll 于 2012-3-2 02:36 编辑

我的 version 1.0
  1. set str=0123_ABCDXYZabcdxyz
  2. rem 版本一代码
复制代码
测试代码运行结果:
一次任务与一次“@echo off命令”耗时比=6219

继续优化。。
我的 version 1.1
  1. set str=0123_ABCDXYZabcdxyz
  2. rem 版本一代码
复制代码
测试代码运行结果:
一次任务与一次“@echo off命令”耗时比=5756
SOS --- >> lllsoslll@163.com

TOP

返回列表