中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【擂台大挑战】替换*=为指定字符的bat代码
« [1] [2] [3] »
作者:
标题: 【擂台大挑战】替换*=为指定字符的bat代码 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【擂台大挑战】替换*=为指定字符的bat代码

在bat中

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

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

几乎可将所有代码的goto循环转换为for循环,这样能大大节约运行时间

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

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

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

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

[ Last edited by plp626 on 2009-10-12 at 19:32 ]

   此帖被 +11 点积分        点击查看详情   
评分人:【 netbenton 分数: +11  时间:2009-10-12 20:34




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 18:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 2 楼』:  

我想问下,除了if 逐一判断字符,难道真的就没有直接set 替换的方法了么?

岂有此理,真没了么?大家对预处理了解多少,对^!%的利用充分吗?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 19:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  

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


         cn-dos擂王




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 19:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 4 楼』:  


@echo off&setlocal enabledelayedexpansion
set @*=星
set @:=帽
set "@>=大"
set "@<=小"

set "str=测试字符串:*/*\**,.=*,...=///&+wodfdfd**<><>==...**:::::*************==========..."
for /l %%a in (0,1,1024) do (
        for /f %%b in ("!str:~%%a,1!") do (
                if defined @%%b (
                        set s=!s!!@%%b!
                ) else (
                        if "%%b" equ "=" (set s=!s!等号) else (set s=!s!%%b)
                )
                set /a n+=1
                echo !n!
        )
)
echo !s!
pause


   此帖被 +5 点积分      点击查看详情   
评分人:【 plp626 分数: +5  时间:2009-10-12 19:41




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-10-12 19:33
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by netbenton at 2009-10-12 07:33 PM:
[code]@echo off&setlocal enabledelayedexpansion
set @*=星
set @:=帽
set "@>=大"
set "@<=小"

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

预处理一个for ..或 if .. 或 else ... 相当于0.5~0.6个set命令的花费时间,我暂时还不敢说你就是擂王



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 19:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 6 楼』:  

楼应是想解决如何把*和=作为参数传递给变量函数吗?

如果是的话,可以存到变量,再以变量名方式传递给函数就可以了,
在函数里面用
for /f "tokens=? delims=?" %%a in ....
来解释,就可以解决任何字符的问题了



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-10-12 19:50
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by netbenton at 2009-10-12 07:50 PM:
楼应是想解决如何把*和=作为参数传递给变量函数吗?

如果是的话,可以存到变量,再以变量名方式传递给函数就可以了,
在函数里面用
for /f &qu ...

不是,不是,这点我肯定。



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 19:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by netbenton at 2009-10-12 07:50 PM:
楼应是想解决如何把*和=作为参数传递给变量函数吗?

如果是的话,可以存到变量,再以变量名方式传递给函数就可以了,
在函数里面用
for /f &qu ...

我拿个简单的例子,只是为了好理解啊:
在你写的那些游戏代码
有N多set,当然你一行一个一个set那样为了可读性强,【再说也没必要追求什么速度】
set a=我>>
set b=you
set x=tt
...
如果想使代码简洁,用for:
for %%a in (
"a=我>>"
"b=you"
"x=tt"
) do set "%%~a"
这样当然可以
可是如果出现一个
set zz=**
你这样
for %%a in (
"a=我>>"
"b=you"
"x=tt"
"zz=**"
) do set "%%~a"
就不行了,// *?在for %%a 被解释为通配符了,

//如果你再采用迂回的办法,先将**放到变量里,然后再上面for,经过两次替换,也可以,不过比较麻烦,而且又会出现一些替换问题要解决,而且这是你事先已经知道zz变量要被赋予**值,而在很多代码中,被赋予的值是未知的,还有,当接受命令行的操作时,这种迂回的方法基本作废了

关于这些例子,我举的是个较简单的一个,对于高级复杂用法,都涉及*,=,~,的替换问题

[ Last edited by plp626 on 2009-10-12 at 20:22 ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-12 20:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 9 楼』:  

先不考虑简洁,前几天看到一位前辈的方法,可以解决8楼问题
@echo off&setlocal enabledelayedexpansion
set cr=^


for /f %%a in ("xa=我>>!cr!xb=you!cr!xx=tt!cr!xz=**") do set "%%~a"
set x
pause




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-10-12 20:31
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 10 楼』:  

一看楼主就知道不是为了调用参数拉~ 上次他说*号替换对计算处理很有用

而且,大部分时候调用参数的内容,那也是俺们自己设置的,哪来的这些东东



俺看中的仅仅是cmd的输入输出模式
if wscript.arguments.count=0 then
   createobject("wscript.shell").run _
   "cmd /c cscript " &chr(34) &wscript.scriptname &chr(34) & " isme &pause"
   wscript.quit
end if

str=("测试字符串:*/*\**,.=*,...=///&+w%%fdfd**==...1*2!34%5='..")
str=replace(str,"*","星")
wscript.echo str
wscript.quit


[ Last edited by 523066680 on 2009-10-12 at 21:01 ]



综合型编程论坛

我的作品索引
  
2009-10-12 20:49
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 11 楼』:  



  Quote:


  Quote:
Originally posted by netbenton at 2009-10-12 08:31 PM:
先不考虑简洁,前几天看到一位前辈的方法,可以解决8楼问题

@echo off&setlocal enabledelayedexpansion
set cr=^


for /f %%a in ("xa=我>>!cr!xb=yo ...

想必你是哪里疏忽代码敲错了,我这里测试没有效果,
---------------
我前面说,**这个值是你已经知道才这么做的,

再看这位“前辈”的思路也并不是很新颖,稍有点多次一举哦
@echo off
set cr="&set "
set "sset=xa=我>>%cr%xb=you%cr%xx=tt%cr%xz=**"
set "%sset%"
set x
//这种方法能精简点代码,但是和8楼的方法比,精简性,可读性都有所逊色,但8楼的缺点...,所以我想寻找完美方案

好了,回归本帖讨论



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2009-10-13 11:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 12 楼』:  

看看这个方法怎样?
@echo off&setlocal enabledelayedexpansion
set a="xa=我>>";^
xb=you;"xg=dir";^
xx=tt;^
xz=**;^
xc=~;^
xe=:::;^
"xf=^^"

set %a:;=&set %

set x
echo;
echo !a:;=^&set !
echo;
pause
如果只是一次定义,总变量"a"还可以与子变量同名,可以释放"a"变量占用的空间

[ Last edited by netbenton on 2009-10-13 at 10:22 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-10-13 12:19
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
plp
新手上路





积分 3
发帖 4
注册 2008-4-29
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by netbenton at 2009-10-13 12:19 PM:
看看这个方法怎样?
[code]@echo off&setlocal enabledelayedexpansion
set a="xa=我>>";^
xb=you;"xg=dir";^
xx=tt;^
xz=**;^
xc=~;^
xe=:::;^
"xf=^^&qu ...

行,这个问题我不较真了,总之,能解决*,=,~,的替换问题,for %%a ()
的方法将是最完美的方案

2009-10-13 12:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp
新手上路





积分 3
发帖 4
注册 2008-4-29
状态 离线
『第 14 楼』:  



  Quote:
一个时间单位相当于1个"set var=0"语句所耗费的时间【详情点击此
@echo off&setlocal enabledelayedexpansion

::内敛函数初始化 // 假定所测试字符串最大长度为120
set "lenth120=set #s=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778^!#1^!^!#1^!&set/a #return=0x^!#s:~-242,2^!-1"

:: 定义所要替换的字符串// 约1个时间单位
set "str=*/*\**,.=*,...=///&+wodfdfd**==...***************==========..."

::调用lenth120函数求str长度,返回值为#return // 约3.6个时间单位
set #1=!str!
%lenth120%

::if逐一判断,替换 // 对1楼长度为62的字符串,一次平均耗时123个时间单位
set ss=&for /l %%a in (0 1 %#return%)do if "!str:~%%a,1!"=="*" (set ss=!ss!*) else if "!str:~%%a,1!"=="=" (set ss=!ss!﹦) else set ss=!ss!!str:~%%a,1!

rem 本代码最耗时的语句为set ss=!ss!!str:~%%a,1!,因为每次循环几乎都会被执行,
echo !ss!
pause
确如二楼所说,若能有直接的set替换方法,那才是质的飞跃,
其时间单位不会超过4

写那么多注释也没人看,如果没有一招致死的代码,下面算是比较简洁的方案
@echo off&setlocal enabledelayedexpansion

set "str=*/*\**,.=*,...=///&+wodfdfd**==...***************==========..."

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!"

echo !ss!&pause
[ Last edited by plp on 2009-10-14 at 10:50 ]

2009-10-13 12:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 15 楼』:  

我做旁观了哦~ ,
对了netbenton,汇编能否做字符处理,可以的话,应该不错的吧。(想像不到,完全不懂……)

现在这个帖子下包括我这个旁观的,也就3个人哦~  其他高人在酝酿什么呢?

哇……plp来帖这么快,我都没看到就灌了水了。verywell。。。

[ Last edited by 523066680 on 2009-10-13 at 12:35 ]



综合型编程论坛

我的作品索引
  
2009-10-13 12:29
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: