中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]批处理函数的高效另类应用方法
作者:
标题: [原创]批处理函数的高效另类应用方法 取消高亮 | 上一主题 | 下一主题
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『楼 主』:  [原创]批处理函数的高效另类应用方法

真正的批处理函数应用方法,高速的!
批处理编程将进入一个新的台阶。。。
目前只支持一个参数,欢迎大家加入讨论。。。
@echo off

::定义函数
set "d-h=setlocal enabledelayedexpansion&set/a dx=#a#&set xs=0123456789abcdef&(for /l %%z in (1,1,4) do set /a x%%z=dx%%16,dx=dx/16)&(for /f "tokens=1-4" %%1 in ("!x1! !x2! !x3! !x4!") do set hx=!xs:~%%4,1!!xs:~%%3,1!&(if !hx!==00 set hx=)&(for %%z in ("!hx!!xs:~%%2,1!!xs:~%%1,1!") do endlocal&set #a#=%%~z))"
::10进制转为16进制的函数,参数入口#a#
::注意要在开启变量延迟前定义

setlocal enabledelayedexpansion

for /l %%a in (1,7,1024) do (
    set abc=%%a
   
        (%d-h:#a#=abc%)
        rem 函数调用
       
        echo !abc!
)


   此帖被 +35 点积分         点击查看详情   
评分人:【 everest79 分数: +20  时间:2009-9-21 12:48
评分人:【 yishanju 分数: +15  时间:2009-9-21 12:51




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-9-21 12:19
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 2 楼』:  

不错,是否可以讲解一下原理?

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

批处理编程迷


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

(%d-h:#a#=abc%)
此句中
d-h为为前面定义的变量,整句经预处理后把变量中的#a#替换为abc
然后再执行相当于在这中间插入了一段代码,但是运行结果只是改变了变量abc的值,对其它没有任何影响

如果,你还有其它的变量需要转换:如num
只需:
(%d-h:#a#=num%)
就可以把num的值从10进制转为16进制了



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

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 4 楼』:  

。。。。果然是把技术玩到令人望尘莫及的程度了。。。
能不能换个简单点的代码讲讲咧。




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-9-21 12:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 5 楼』:  

netbenton 什么时候搞出方便直接调WIN32 API 的批处理代码啊
哈哈




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-9-21 13:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


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

re 楼上,api函数,返回的大部分都是地址值,对批处理来说太难了,因为批处理里面根本就没有地址可言。


========分隔线=======


这种用法可以支持多参数了,len函数为两个参数
@echo off

::定义函数
set "d-h=setlocal enabledelayedexpansion&set/a dx=#a#&set xs=0123456789abcdef&(for /l %%z in (1,1,4) do set /a x%%z=dx%%16,dx=dx/16)&(for /f "tokens=1-4" %%1 in ("!x1! !x2! !x3! !x4!") do set hx=!xs:~%%4,1!!xs:~%%3,1!&(if !hx!==00 set hx=)&(for %%z in ("!hx!!xs:~%%2,1!!xs:~%%1,1!") do endlocal&set #a#=%%~z))"
::10进制转为16进制的函数,调用方法:%d-h:#a#=变量名%

set "len=for /f "tokens=1-3" %%1 in ("#a#") do setlocal enabledelayedexpansion&(if defined %%2 (set /a z=8180,x=0&(for /l %%a in (1,1,14) do set/a "y=(z-x)/2+x"&(for %%b in (!y!) do if "!%%2:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)))) else (set z=0))&(for %%z in ("!z!") do endlocal&set %%1=%%~z)"
::取字符串长度函数,调用方法:%len:#a#=结果变量名 字符串变量名%
setlocal enabledelayedexpansion

for /l %%a in (1,7,1024) do (
    set abc=%%a

        (%len:#a#=slen abc%)
        (%d-h:#a#=abc%)
        (%len:#a#=dlen abc%)
        rem 函数调用
       
        echo %%a转成16进制为:!abc!   转换前字符数:!slen!  转换后字符数:!dlen!
)




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

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 7 楼』:  

很好,又丢数据了




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-9-29 16:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  

每个月,总有那么几天。。。



2009-9-29 16:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


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

我积分回到1900了…… 那个兴奋,睡不着了。



综合型编程论坛

我的作品索引
  
2009-9-30 08:40
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: