[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理函数的高效另类应用(免call的哦!)

高速的真正的批处理函数应用方法!
并非调用子过程。。。

我想这次应该可以把批处理编程推向一个新的台阶。
目前只支持一个参数,
欢迎大家加入讨论。。。
  1. @echo off
  2. ::定义函数
  3. 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))"
  4. ::10进制转为16进制的函数,参数入口#a#
  5. ::要在开启变量延迟之前定义
  6. setlocal enabledelayedexpansion
  7. for /l %%a in (1,7,1024) do (
  8.     set abc=%%a
  9.    
  10. (%d-h:#a#=abc%)
  11. rem 函数调用
  12. echo !abc!
  13. )
  14. pause
复制代码

[ 本帖最后由 netbenton 于 2009-9-22 13:10 编辑 ]
6

评分人数

可以支持多参数了
len函数为两个参数,
  1. @echo off
  2. ::定义函数
  3. 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))"
  4. ::10进制转为16进制的函数,调用方法:%d-h:#a#=变量名%
  5. 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)"
  6. ::取字符串长度函数,调用方法:%len:#a#=结果变量名 字符串变量名%
  7. setlocal enabledelayedexpansion
  8. for /l %%a in (1,7,1024) do (
  9.     set abc=%%a
  10.         (%len:#a#=slen abc%)
  11.         (%d-h:#a#=abc%)
  12.         (%len:#a#=dlen abc%)
  13.         rem 函数调用
  14.         
  15.         echo %%a转成16进制为:!abc!   转换前字符数:!slen!  转换后字符数:!dlen!
  16. )
  17. pause
复制代码

[ 本帖最后由 netbenton 于 2009-9-22 13:10 编辑 ]

TOP

这种方法,对于函数的内部结构,可读性是很差,但是对于主程序的可读性却表现得非常好

看:
(%len:#a#=slen abc%)
调用用函数len,作用是,计算变量abc中字符串的长度,把结果存到变量slen中

使用函数的作用不就是为了简化主程序吗?
而对于函数,通常都是引用前人或者自己常用的功能代码,只要根据注释使用就可以了,
根本就不必去理会函数的内部做了什么。就像其它编程语言调用api和dos中断一样,难道还要去了解其内部是怎么运行的吗?

有了这种函数,就算是批处理新手,也可以轻松写出高效的批处理来,
就算是老手要写较大型的批程序时,这些可是很好的砖瓦啊。
这种函数定义只要一行就可以了,不足处是要占用一个变量名,和环境变量空间,但是这对于效率来说,这点是微小的,因为一个call :sub子过程用时相当于30层的call,及执行300次的set var=n,当然有一点,call  sub.bat这种用法,要比call :sub 批处理内部子过程要快一半,但也是比用%len:#a#=var%多出来的时间,效率可想而知了。


经过这样封装的函数,是不可能会破坏主程序的结构的,4楼对len函数的使用,主程序和函数同进使用了同一个for令牌%%a却一样可以得到正确的结果。函数内部的变量使用完全是临时的,在函数结束时已经用endlocal清场,只保存返回结果。

TOP

返回列表