Board logo

标题: [原创]批处理函数的高效另类应用方法 [打印本页]

作者: netbenton     时间: 2009-9-21 12:19    标题: [原创]批处理函数的高效另类应用方法

真正的批处理函数应用方法,高速的!
批处理编程将进入一个新的台阶。。。
目前只支持一个参数,欢迎大家加入讨论。。。
@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!
)

作者: uiopuiop     时间: 2009-9-21 12:28
不错,是否可以讲解一下原理?
作者: netbenton     时间: 2009-9-21 12:41
(%d-h:#a#=abc%)
此句中
d-h为为前面定义的变量,整句经预处理后把变量中的#a#替换为abc
然后再执行相当于在这中间插入了一段代码,但是运行结果只是改变了变量abc的值,对其它没有任何影响

如果,你还有其它的变量需要转换:如num
只需:
(%d-h:#a#=num%)
就可以把num的值从10进制转为16进制了
作者: yishanju     时间: 2009-9-21 12:53
。。。。果然是把技术玩到令人望尘莫及的程度了。。。
能不能换个简单点的代码讲讲咧。
作者: yishanju     时间: 2009-9-21 13:12
netbenton 什么时候搞出方便直接调WIN32 API 的批处理代码啊
哈哈
作者: netbenton     时间: 2009-9-21 21:32
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!
)

作者: yishanju     时间: 2009-9-29 16:10
很好,又丢数据了
作者: HAT     时间: 2009-9-29 16:16
每个月,总有那么几天。。。
作者: 523066680     时间: 2009-9-30 08:40
我积分回到1900了…… 那个兴奋,睡不着了。