中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-24 11:13
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]批处理函数的高效另类应用方法 查看 1,272 回复 8
楼 主 [原创]批处理函数的高效另类应用方法 发表于 2009-09-21 12:19 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
真正的批处理函数应用方法,高速的!
批处理编程将进入一个新的台阶。。。
目前只支持一个参数,欢迎大家加入讨论。。。


@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!
)
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
everest79 +20 2009-09-21 12:48
yishanju +15 2009-09-21 12:51
精简
=> 个人网志
2 发表于 2009-09-21 12:28 ·  新加坡 惠普HP
中级用户
★★
积分 400
发帖 211
注册 2007-09-30 18:02
18年会员
UID 98650
性别 男
状态 离线
不错,是否可以讲解一下原理?
3 发表于 2009-09-21 12:41 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
(%d-h:#a#=abc%)
此句中
d-h为为前面定义的变量,整句经预处理后把变量中的#a#替换为abc
然后再执行相当于在这中间插入了一段代码,但是运行结果只是改变了变量abc的值,对其它没有任何影响

如果,你还有其它的变量需要转换:如num
只需:
(%d-h:#a#=num%)
就可以把num的值从10进制转为16进制了
精简
=> 个人网志
4 发表于 2009-09-21 12:53 ·  中国 北京 朝阳区 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
。。。。果然是把技术玩到令人望尘莫及的程度了。。。
能不能换个简单点的代码讲讲咧。

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
5 发表于 2009-09-21 13:12 ·  中国 北京 朝阳区 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
netbenton 什么时候搞出方便直接调WIN32 API 的批处理代码啊
哈哈

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
6 发表于 2009-09-21 21:32 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
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!
)
精简
=> 个人网志
7 发表于 2009-09-29 16:10 ·  中国 北京 西城区 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
很好,又丢数据了

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
8 发表于 2009-09-29 16:16 ·  新加坡
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
每个月,总有那么几天。。。
9 发表于 2009-09-30 08:40 ·  中国 广东 广州 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
我积分回到1900了…… 那个兴奋,睡不着了。
论坛跳转: