纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

  2021-09-15 我要评论
想了解批处理函数的高效另类应用(免call)的相关内容吗在本文为您仔细讲解bat高效另类应用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:bat高效下面大家一起来学习吧

高速的真正的批处理函数应用方法!并非调用子过程我想这次应该可以把批处理编程推向一个新的台阶

目前只支持一个参数

@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!
)
pause

可以支持多参数了
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!
)
pause

思路确实够新
但是因为两个原因不建议推广
代码的可阅读性降低
环境变量的过分使用也会影响效率

对于函数的效率问题
我觉得还是传统的”goto对“来得更加简单、自由和高效

通常情况下

应该避免在组合语句(括号对中的语句)中使用函数
如果综合权衡后还是要使用
那么就需要保证组合语句的循环和递归级数满足设计要求

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

看:
(%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清场只保存返回结果

想说些赞美的话不好说出口在一次创作中突然想起netbenton这种函数的用法于是也山寨了一个呵呵确实如楼主所言发展一些高效的、正确的、常用的函数很有必要能够充分扩展批处理的功能使得批处理累积起更大的功能从而实现更高的跨越式的发展

对于重复命令调用处理的方法和技术目前看来有几种:
1、复制粘贴重复出现这种模式在执行任务与命令比较少的情况下可以使用比如使用echo产生两三行空行总比使用for产生的划算吧?这种模式的结果是造成大量重复代码缺乏效率
2、使用标签GOTO跳转把那些反复使用的同一功能段的代码做成一个标签然后使用goto跳转这是最基本的模式但goto只负责跳出去而不跳回来要想代码自动回来则需要再跳一次
3、使用标签Call调用call的好处是跳到其他标签后能够自动跳回来之所以能够自动跳回来因为call在原来代码后面使用了标记可能使用了更多的内存存储来暂停原来的进程所以相对而言会显得较慢一些但Call对参数有很好的支持使得人们对其无法割舍
4、使用FOR命令化繁为简将那些符合FOR特性的命令融合到FOR当中即可减少必要的重复操作
5、使用函数扩大变量将一些命令组合赋值到某一个特定的变量中变成通用函数支持参数它不需要重新建立标签但它占据了一个变量空间这种模式适用于所赋值的命令组合比较简短占用空间不大的变量函数中可以方便封装以用于不同的批处理程序中


相关文章

猜您喜欢

  • Spring Boot @Async异步线程池 Spring Boot之@Async异步线程池示例详解

    想了解Spring Boot之@Async异步线程池示例详解的相关内容吗hguisu在本文为您仔细讲解Spring Boot @Async异步线程池的相关知识和一些Code实例欢迎阅读和指正我们先划重点:springboot异步线程池,springboot线程池使用实例,springboot,@async的使用下面大家一起来学习吧..
  • Java设计模式之策略模式 Java设计模式之java策略模式详解

    想了解Java设计模式之java策略模式详解的相关内容吗大忽悠爱忽悠在本文为您仔细讲解Java设计模式之策略模式的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java设计模式,Java策略模式下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式