|
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!
)
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-9-21 12:19 |
|
|
uiopuiop
中级用户
积分 400
发帖 211
注册 2007-9-30
状态 离线
|
|
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 |
|
|
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 |
|
|
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
状态 离线
|
|
2009-9-30 08:40 |
|