批处理 函数
- 格式:docx
- 大小:36.47 KB
- 文档页数:1
[批处理]计算时间差的函数etime计算时间差的函数etime 收藏/thread-4701-1-1.html这个是脚本代码[保存为etime.bat放在当前路径下即可:免费内容::etime <begin_time> <end_time> <return> rem 所测试任务的执行时间不超过1天// 骨瘦如柴版setlocal&set be=%~1:%~2&setcc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1% %c&set dy=-8640000for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>> 31")&exit/b----------------------------------------------------------------------------------------------------------------------------------------计算两个时间点差的函数批处理etime今天兴趣大法思考了好多bat的问题,以至于通宵在论坛逛看到有个求时间差的"函数"被打搅调用地方不少(大都是测试代码执行效率的)免费内容::time0::计算时间差(封装)@echo off&setlocal&set /a n=0&rem code 随风@for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do ( set /an+=10%%a%%100*360000+10%%b%%100*6000+10%% c%%100*100+10%%d%%100set /an-=10%%e%%100*360000+10%%f%%100*6000+10%%g %%100*100+10%%h%%100)set /as=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/1 00,n=n%%100set "ok=%s% 小时%f% 分钟%m% 秒%n% 毫秒" endlocal&set %~3=%ok:-=%&goto :EOF这个代码的算法是统一找时间点凌晨0:00:00.00然后计算任何一个时间点到凌晨的时间差(单位跑秒)然后任意两个时间点求时间差就是他们相对凌晨时间点的时间数的差对09这样的非法8进制数的处理用到了一些技巧,还有两个时间参数不分先后顺序,可全可点,但是这个代码一行是可以省去的(既然是常被人掉用自然体积越小越好):免费内容:@echo offf&setlocal&set/a n=0&set"s=+:%~1^&echo -:%~2"for /f "tokens=1-5 delims=.:" %%a in ('echo %s%') do (rem code 随风@set/an%%a=10%%b%%100*360000+10%%c%%100*6000+10 %%d%%100*100+10%%e%%100)set /as=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/1 00,n=n%%100set "ok=%s% 小时%f% 分钟%m% 秒%n% 跑秒" endlocal&(if %3. neq . (echo %ok:-=%) elseset %~3=%ok:-=%)&exit/b再研究下,有更简短的版本这个代码是我在cn-dos写过的,今天再优化了下更简短代码的算法深入一层:用hmsw(各字母代表一个两位数字)表示标准时间我们记他到凌晨的相对时间数为TxTx=hmsw时间点-0:00:00.00时间点=h*3600*100+m*60*100+100*s+whmsw 8位10进制数表示的时间数(单位0.01秒)就是hmsw 跑秒hmsw=w+100*s+10000*m+1000000*hhmsw-Tx=640000*h+4000*m所以Tx=hmsw-(640000*h+4000*m)=hmsw-4000*(160*h+m)那么Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(h_2-h_1)+(m_2-m_1))对与09这样的非法8进制数我们给他们每个前面加上1就可以保证是十进制数又能保证差值不变对于非同一天的时间(这种情况较少,除非你在接近0晨时调用)我们把用8640000-去替换负号再用set/a赋值就是下面代码用到的算法Tx_2-Tx_1=hmsw_2-hmsw_1-4000*(160*(1h_2-1h_1)+(1m _2-1m_1))免费内容:rem 兼容时间点跨天的情行,时间格式00:00:00.00 或者0:00:00.00 皆可:_difftime <Begin_Time> <End_Time> [ret] //返回两个时间点的差值(单位0.01秒)Setlocal enabledelayedexpansion&setb=0%1&set e=0%2&setc=1!e:~-11!-1!b:~-11!&set c=!c::=!set/ac=%c:.=%-4000*(160*(1%e:~-11,-9%-1%b:~-11,-9%)+1% e:~-8,-6%-1%b:~-8,-6%)endlocal & (if %3.==. (echo %c:-=8640000-%) else set/a %3=%c:-=8640000-%)&exit/b给difftime前面加上_是为了表明不是临时写的子过程也为了以后连接库函数标签的唯一性// 题外话:对于子过程,若启用了变量延迟,原则上三行都可以写完,尽量写紧凑些(因为没人读),但是对于算法,思路性的东西要能舍得笔墨,越详细越好,我发现即使你的代码写得再好,不会有人全搬,都会小修改,你自己初写代码时不可能考虑到所有人使用的具体情况,自然没人愿意很详细看你的代码,倒是你的思路为别人提供了一个方法,在此意义上函数库的作用起到方法库的作用发表于@ 2009年12月15日04:48:00 | 评论( 0 ) | 编辑| 举报| 收藏旧一篇:网吧母盘常用批处理| 新一篇:更改SysListView32内的项查看最新精华文章请访问博客首页相关文章批处理修改网络打印机端口的主机地址DOS延时实现批处理问题:SET 命令在FOR 循环中失效/ SET 环境变量生存域/作用域批处理for中如何实现break在不同日期格式下批处理输出自定义格式的日期和时间svn钩子程序自动备份配置库的批处理文件bat 批处理获取ip批处理获取本机IP(局域网)及MAC地址本文来自CSDN博客,转载请标明出处:/wq1282/archive/2009/12/16/5008350. aspx。
批处理中的字符串处理详解2008年03月25日 14:57首先说一下,批处理和高级语言不同,没有字符串处理函数,比如strcat之类的,但是却可以利用环境变量来实现这些函数的功能。
本文对照C语言中的字符串处理函数,讲解在批处理中的实现方法。
首先说一下字符串的存储,在C语言中,采用字符数组或者字符指针来存储字符串,而BAT 中没有这些东东,所以要依靠环境变量来存储。
设置环境变量的语句为set语句,本文不详细介绍了,参考set /?语句。
1、C语中的strcpy函数,将一个字符串复制到另一个字符型指针或字符数组,覆盖原来的字符串。
C语言中的调用方法:strcpy(目标字符串,源字符串)在批处理中的实现方法:set 目标字符串=%源字符串%示例:复制内容到剪贴板代码:@echo off::关闭屏幕回显(可选)set str1=This is old string::设置str1中存储的字符串,注意没有双引号,这点与C语言等不同!set str2=This is new string::设置str2中存储的字符串echo 执行字符串拷贝以前:echo str1=%str1%echo str2=%str2%::先输出一次原有的字符串set str1=%str2%::字符串拷贝echo 执行字符串拷贝以后:echo str1=%str1%echo str2=%str2%::输出执行完字符串拷贝后的字符串echo 输出完毕,按任意键退出&&pause>nul&&exit::输出信息,当用户按任意键时,结束该批处理。
效果图:截图00145.PNG (8.8 KB)2008-3-25 14:212、C语中的strcat函数,将一个字符串连接到另一个字符型指针或字符数组的末尾。
C语言中的调用方法:strcat(目标字符串,源字符串)在批处理中的实现方法:set 目标字符串=%目标字符串%%源字符串%示例:复制内容到剪贴板代码:@echo offset str1=This is string1set str2=This is string2::设置str1和str2中存储的字符串echo 连接字符串以前:echo str1=%str1%echo str2=%str2%::先输出一次原有的字符串set str1=%str1%%str2%::字符串连接echo 连接字符串以后:echo str1=%str1%echo str2=%str2%::输出执行完字符串连接后的两个字符串echo 输出完毕,按任意键退出&&pause>nul&&exit效果图:截图00146.PNG (8.69 KB)2008-3-25 14:213、字符串截取,C中没有这种函数,不过可以通过语句实现,不再介绍,直接说批处理的。
批处理命令注释方法批处理命令是一种在Windows操作系统下批量执行一系列命令的方法,它可以帮助我们自动化一些重复性的操作。
在编写批处理命令时,为了方便自己和他人阅读和理解代码,我们经常需要添加注释。
本文将介绍一些常用的批处理命令注释方法。
一、REM命令注释REM是批处理命令中的注释命令,它可以在批处理脚本中添加注释,不会被执行。
REM后面的文本将被视为注释内容。
例如,我们可以使用REM命令注释说明某一行代码的作用:```REM 这是一个注释示例```二、::命令注释::是另一种常用的注释方法,它与REM命令一样,可以在批处理脚本中添加注释,不会被执行。
::后面的文本将被视为注释内容。
例如,我们可以使用::命令注释说明某一行代码的作用:```:: 这是一个注释示例```三、@echo off命令注释@echo off命令用于关闭批处理命令的命令回显功能,即在执行批处理脚本时不显示命令本身。
我们可以在@echo off命令后面添加注释,以解释脚本的功能和用途。
例如,我们可以使用@echo off命令注释说明整个批处理脚本的作用:```@echo offREM 这是一个批处理脚本示例,用于批量处理文件```四、标题注释在批处理脚本中,我们可以使用标题注释来标识和说明脚本的功能和用途。
标题注释通常位于脚本的开头,并使用一行或多行注释来进行说明。
例如,我们可以使用标题注释来说明脚本的功能和用途,并添加作者和日期信息::: 批处理脚本示例:: 作者:XXX:: 日期:YYYY-MM-DD@echo offREM 以下是脚本的具体执行逻辑```五、函数注释在批处理脚本中,我们可以定义自己的函数来实现一些特定的功能。
为了方便理解函数的作用和用法,我们可以使用函数注释来进行说明。
例如,我们可以使用函数注释来说明函数的功能、输入参数和返回值:```:: 函数名称:add:: 功能:实现两个数相加的功能:: 输入参数:num1 - 第一个操作数:: num2 - 第二个操作数:: 返回值:相加的结果六、代码行注释除了在整个脚本或函数级别上进行注释,我们还可以在代码行级别上添加注释,以解释某一行代码的作用和用途。
C#动态执⾏批处理命令C# 动态执⾏⼀系列控制台命令,并允许实时显⽰出来执⾏结果时,可以使⽤下⾯的函数。
可以达到的效果为:持续的输⼊:控制台可以持续使⽤输⼊流写⼊后续的命令⼤数据量的输出:不会因为⼤数据量的输出导致程序阻塞友好的 API:直接输⼊需要执⾏的命令字符串即可函数原型为:/// <summary>/// 打开控制台执⾏拼接完成的批处理命令字符串/// </summary>/// <param name="inputAction">需要执⾏的命令委托⽅法:每次调⽤ <paramref name="inputAction"/> 中的参数都会执⾏⼀次</param>private static void ExecBatCommand(Action<Action<string>> inputAction)使⽤⽰例如下:ExecBatCommand(p =>{p(@"net use \\10.32.11.21\ERPProject yintai@123 /user:yt\ERPDeployer");// 这⾥连续写⼊的命令将依次在控制台窗⼝中得到体现p("exit 0");});注:执⾏完需要的命令后,最后需要调⽤exit命令退出控制台。
这样做的⽬的是可以持续输⼊命令,知道⽤户执⾏退出命令exit 0,⽽且退出命令必须是最后⼀条命令,否则程序会发⽣异常。
下⾯是批处理执⾏函数源码:/// <summary>/// 打开控制台执⾏拼接完成的批处理命令字符串/// </summary>/// <param name="inputAction">需要执⾏的命令委托⽅法:每次调⽤ <paramref name="inputAction"/> 中的参数都会执⾏⼀次</param>private static void ExecBatCommand(Action<Action<string>> inputAction){Process pro = null;StreamWriter sIn = null;StreamReader sOut = null;try{pro = new Process();pro.StartInfo.FileName = "cmd.exe";eShellExecute = false;pro.StartInfo.CreateNoWindow = true;pro.StartInfo.RedirectStandardInput = true;pro.StartInfo.RedirectStandardOutput = true;pro.StartInfo.RedirectStandardError = true;pro.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);pro.ErrorDataReceived += (sender, e) => Console.WriteLine(e.Data);pro.Start();sIn = pro.StandardInput;sIn.AutoFlush = true;pro.BeginOutputReadLine();inputAction(value => sIn.WriteLine(value));pro.WaitForExit();}finally{if (pro != null && !pro.HasExited)pro.Kill();if (sIn != null)sIn.Close();if (sOut != null)sOut.Close();if (pro != null)pro.Close();}}。
批处理等待/延迟/暂停1、暂停(Pause)、延迟(Delay)、等待(Wait)、睡眠(Sleep)1)for+set+if,时间精度为0.01秒,适用平台为WinNT/2K/XP/2003。
利用for解析变量%time%并存为两个时间点%start%和%now%,再利用set /a计算两个时间点的时间差,最后用if判断时间差是否达到设定的暂停时间。
@echo offsetlocal enableextensionsecho %time%call :ProcDelay 200echo %time%goto :EOF:ProcDelay delayMSec_setlocal enableextensionsfor /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k:_procwaitloopfor /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%kset /a diff_=%now_%-%start_%if %diff_% LSS %1 goto _procwaitloopendlocal & goto :EOF2)VBS脚本中的sleep函数,时间精度为0.001秒,使用平台为Win9x/WinNT系列。
动态创建一个调用sleep()函数的VBS脚本,然后用Windows脚本宿主的命令行版本cscript调用它。
@echo off & setlocal enableextensions enabledelayedexpansionecho WScript.Sleep 2000 > %temp%\tmp$$$.vbsecho %time%cscript //nologo %temp%\tmp$$$.vbsecho %time%for %%f in (%temp%\tmp$$$.vbs) do if exist %%f del %%fendlocal & goto :EOF3)ping的消息发送间隔,时间精度为1秒,使用平台为Win9x/WinNT系列。
Windows批处理(bat)语法⼤全%~dp0[获取当前路径]%~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,⽬录cd %~dp0 :进⼊批处理所在⽬录cd %~dp0bin\ :进⼊批处理所在⽬录的bin⽬录⽰例这个⽰例在win10 x64测试正常::作⽤:以管理员⾝份安装Apached:cd %~dp0binhttpd.exe -k install -n “Apache24”运⾏结果以管理员⾝份运⾏ ⽰例.bat ,执⾏结果如下:C:\Windows\system32>d:D:>cd D:\Server\Apache24\binD:\Server\Apache24\bin>httpd.exe -k install -n “Apache24”我的常⽤命令%cd%[执⾏的路径]当前执⾏的路径,并⾮⽬标⽂件的路径taskkill /f /im notepad.exe [终⽌进程]taskkill /?打开帮助cmd窗⼝中⽂乱码在CMD窗⼝右键/默认值,打开属性选择 “默认代码页为简体中⽂GBK”,获取命令帮助 xxx /?遇到记不清楚的命令,但记得名字,就可以键⼊ 命令名 空格 /?就会有详细的该命令的帮助了,⽐如:ping /? cd /?查看内置命令的帮助信息ver /?cmd /?set /?rem /?if /?echo /?goto /?for /?shift /?call /?其他常⽤的命令type /?find /?findstr /?copy /?#⼀、基础语法1.批处理⽂件是⼀个“.bat”结尾的⽂本⽂件,这个⽂件的每⼀⾏都是⼀条DOS命令。
可以使⽤任何⽂本⽂件编辑⼯具创建和修改。
2.批处理是⼀种简单的程序,可以⽤ if 和 goto 来控制流程,也可以使⽤ for 循环。
3.批处理的编程能⼒远不如C语⾔等编程语⾔,也⼗分不规范。
批处理:FOR的参数/F之delims详解下(原创)代码:@echo offfor /f "delims=:" %%a in (易经.txt) do echo %%apause>nul运行结果将显示第一小节(列)的内容。
原因是没有定义显示的列,默认情况下忽略第一个分隔符(冒号)后面的内容。
要显示列,需要用到下节学习的tokens。
如:@echo offfor /f "tokens=1,2 delims=:" %%a in (易经.txt) do echo %%a %%bpause>nul你也可以使用冒号(:)和逗号(,),写法是“delims=:,”(使用英文双引号)。
原文中的每行文字将被作为分隔符的冒号和逗号分成多个小节:(不知道百度怎么搞的,竟然说我的表格超载!省略了)代码:@echo offfor /f "delims=:," %%a in (易经.txt) do echo %%apause>nul运行结果将显示第一小节(列)的内容。
没有定义列的时候,默认只显示第一列,忽略分隔符和第一个分隔符后的内容。
例如:文本“静夜思.txt”的内容是:床前明月光,疑是地上霜,举头望明月,低头思故乡。
文本中有四句古诗,诗句之间用逗号分隔。
古诗原本是没有标点符号的,标点符号是后人才加上去的。
逗号在语文上是语气暂停的意思,其实就是用来分隔语句意思以便于阅读和理解。
Delims=,的意思就是提取逗号做分隔符,并以此将诗句分成四个小列或小节。
第一列分隔符第二列分隔符第三列分隔符第三列第一行床前明月光,疑是地上霜,举头望明月,,低头思故乡。
如果我要用for将四句诗都显示到屏幕上,不需要任何参数即能实现:@echo offfor /f %%i in (静夜思.txt) do echo %%ipause>nul如果我只要“床前明月光”这句话,就需要delims帮忙了:@echo offfor /f "delims=," %%i in (静夜思.txt) do echo %%ipause>nul讲解:delims=后面跟了一个逗号,表示用原文中的逗号作为分隔符(划分的方法)将古诗分成四个小节。
Windows批处理脚本---取得指定N天前的日期windows批处理获取几天前的日期。
目前是去年1月1日志今天的所有日期。
可另存为*.bat脚本直接执行。
Rem 获取当天x天前的日期@echo offrem 开启变量延迟setlocal enabledelayedexpansionset baseDir=D:rem == 需要输入参数 agoDaysrem 设定天数(0~365)set agoDays=30if agoDays EQU "" set agoDays=60if %agoDays% GTR 365 set agoDays=365rem 初始化新日期set newDate=0rem 日志文件set logFile=%baseDir%\\logs.txtecho ==== Begin %date% %time% ==== >>%logFile%REM echo %date% %time% >>%logFile%rem 调用子函数获取几天前的日期call :date2days2date %agoDays%echo newDate=!newDate!>>%logFile%goto endLooprem 获取当前时间的目录名:date2days2dateset agoDays=%1set curDays=0for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do ( set YY=%%a&set MM=%%b&set DD=%%c&if "!MM:~0,1!"=="0" set MM=!MM:~1!if "!DD:~0,1!"=="0" set D=!DD:~1! )if !MM! EQU 1 set /a "M_31=0","M_2829=0"if !MM! EQU 3 set /a "M_31=1"if !MM! EQU 5 set /a "M_31=2","M_30=1"if !MM! EQU 7 set /a "M_31=3","M_30=2"if !MM! EQU 8 set /a "M_31=4","M_30=2"if !MM! EQU 10 set /a "M_31=5","M_30=3"if !MM! EQU 12 set /a "M_31=6","M_30=4"if !MM! EQU 2 set M_2829=Dif !MM! EQU 4 set /a "M_31=2","M_30=0"if !MM! EQU 6 set /a "M_31=3","M_30=1"if !MM! EQU 9 set /a "M_31=5","M_30=2"if !MM! EQU 11 set /a "M_31=6","M_30=3"if !MM! GTR 2 set /a "R=(^!(YY%%4)&^!^!(YY%%100))|^!(YY%%400)","M_2829=28+ R"set /a curDays=M_2829+30*M_30+31*M_31+Dset /a disDays=curDays-agoDaysset yTh=%YY%set R=0if !disDays! LEQ 0 set /a "yTh=%YY%-1","R=(^!(yTh%%4)&^!^!(yTh%%100))|^!(yTh%%400)","disDays =365+R+disDays"set xDay=%disDays%set newM=1set newD=0set /a "R=(^!(yTh%%4)&^!^!(yTh%%100))|^!(yTh%%400)","C_2829=2 8+R"for %%a in (31, !C_2829!,31,30,31,30,31,31,30,31,30,31) do ( if !xDay! LEQ %%a set /a "newD=!xDay!"&(if !newM! LSS 10 set newM=0!newM!if !newD! LSS 10 set newD=0!newD!set newDate=!yTh!!newM!!newD!)&goto tuiChuif !xDay! GTR %%a set /a "newM+=1","xDay-=%%a"):tuiChugoto :EOF:endLoopecho ==== End %date% %time% ==== >>%logFile%。
批处理bat函数:⼤数字加减乘除、时期时间计算、数字排序、进制转换等⽬录计算任意位数的正整数加法计算1000位以内的正整数减法计算任意位数的正整数乘法500位内整数除法函数计算时间差可以处理0开头的数、重复数及200位以内的超⼤整数(封装)计算指定天数前/后的⽇期及星期进制转换(函数)1、任意进制互转⼆进制转⼗六进制(封装)(通过4位⼀段转换,可处理超⼤数)⼗六进制转⼆进制(封装)(通过4位⼀段转换,可处理超⼤数)⼆进制转⼗进制(封装)(只能处理cmd范围内的数,⼩巧⽅便代码中调⽤)获取10进制数(含负数)的原码、反码、补码(未封装)转换 2、8、10、16、进制数并显⽰2进制原码、反码、补码(未封装)发⼏个我的函数2009-02-20 ⽇更新:修正加法函数中⼀处bug,增加整数除法“函数”(内勘多个标签,应该不算标准的封装)2009-02-18 ⽇更新:更新乘法函数,⼤⼤缩短代码,并且效率⼤⼤提升,且不再受位数限制。
理论上只要积不超过变量赋值的最⼤位数就可以。
更新加法函数:代码略增,效率略为提⾼,且不再受位数限制。
更新减法函数:代码略增,效率提⾼,位数由200提升到1000位。
⼀、加法函数任意位数的正整数进⾏加法计算⼆、减法函数可以对 200位以内正整数进⾏减法计算三、乘法函数可以对任意位数的正整数进⾏乘法计算四、计算批处理运⾏时间函数时间必须是24⼩时制,未考虑时间为00点的情况。
五、查询指定天数前的⽇期(作者:Will Sort 出⾃:cn-dos )六、数字排序函数七、关于进制转换的函数1、任意进制互转(只能处理cmd范围内的数)标签段以封装,可直接调⽤,使⽤⽅法见标签上⽅的说明为⽅便使⽤,标签以外的代码作了界⾯美化等处理。
使得代码略显臃肿。
2、⼆进制转⼗六进制(封装)(通过4位⼀段转换,可处理超⼤数)3、⼗六进制转⼆进制(封装)(通过4位⼀段转换,可处理超⼤数)4、⼆进制转⼗进制(封装)(只能处理cmd范围内的数,⼩巧⽅便代码中调⽤)5、获取10进制数(含负数)的原码、反码、补码(未封装)(只能处理cmd范围内的值)完全不懂计算机,只理解为计算机中负数⽤补码表达代码中⼆进制数⽤32位显⽰,超出32位的会出错,呵呵,不知道电脑中有没有⽤32位以上表达的⼆进制数,哈哈外⾏话见笑了^_^6、综合以上对2、8、10、16进制数进⾏转换、(未封装)显⽰转换后的2、8、10、16进制数及原码、反码、补码计算任意位数的正整数加法@echo offcall :jia 354687654165435 35486456 okecho %ok%pause:jia 加法函数(封装)by @随风 @::计算任意位数的正整数加法setlocal enabledelayedexpansion&set f=&set "t="set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0for /l %%a in (0 1 9) do (set vard1=&set "vard2="set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!) (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!" for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)if !j! neq 0 set "t=!j!!t!"Endlocal&set %~3=%t%&goto :EOF计算1000位以内的正整数减法@echo offcall :jian 354687654165435 35486456 okecho %ok%pause:jian 减法函数(封装)by @随风 @::计算1000位以内的正整数减法setlocal enabledelayedexpansion&&set t=&set f=&set "lin="for /l %%a in (1 1 10) do set "lin=0000000000!lin!"set lin=!lin!!lin!!lin!!lin!!lin!&set "lin=!lin!!lin!"set var1=!lin!%~1&set var2=!lin!%~2&set vard1=&set/a j=0set var1=!var1:~-1000!&set "var2=!var2:~-1000!"if "!var1!" lss "!var2!" (set var1=%~2&set "var2=%~1"set "f=-") else set var1=%~1&set "var2=%~2"for /l %%a in (0 1 9) do set "var1=!var1:%%a= %%a !"for %%a in (!var1!) do set "vard1=%%a !vard1!"for %%a in (!vard1!) do (if "!var2!"=="" set/a var2=0set /a a=%%a-j,b=!var2:~-1!if !a! lss !b! (set /a a+=10,j=1)else set /a j=0set /a w=a-b&set t=!w!!t!&set var2=!var2:~0,-1!)for /f "tokens=* delims=0" %%a in ("!t!") do (if "%%a"=="" (set t=0) else set "t=%%a")Endlocal&set %~3=%f%%t%&goto :EOF计算任意位数的正整数乘法@echo offcall :cen 354687654165435 35486456 okecho %ok%pause:cen 乘法函数(封装)by @随风 @::计算任意位数的正整数乘法setlocal enabledelayedexpansionif "%~1"=="0" Endlocal&set %~3=0&goto :EOFif "%~2"=="0" Endlocal&set %~3=0&goto :EOFset f=&set jia=&set ji=&set /a n1=0,n2=0set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"for /l %%a in (0 1 9) do (set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !) for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!) for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)for %%a in (!vard1!) do (set "t="&set /a j=0for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)set "ji=!t:~-1!!ji!"if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"set jia=!ss!!t:~0,-1!)if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"set "ji=!t!!ji:~1!"Endlocal&set %~3=%ji%&goto :EOF500位内整数除法函数@echo offset suru=000012/001200call :cu0 %suru:/= % okecho. %ok%pauseexit:cu0 500位内整数除法函数(封装)by @随风 ::函数内有 cu1 cu2 cu3 cu4 四个标签,引⽤时需注意setlocal enabledelayedexpansion&set "lin=00000"set /a zongw=1000,cs1w=0,cs2w=0,falg=0,x=0if "!str!"=="1" Endlocal&set %~3=%ff%!num!&goto :EOFif "%~1"=="0" set sang=0&goto cu4if "!str!"=="0" set sang=以零为除数的错误。
批处理命令中if语句用法系统讲解(含goto语句)众所周知,if条件分支语句是编程语言的三大结构之一。
在DOS批处理中亦是如此,if语句基本上是编程绕不开的语法点之一,本篇从多个角度系统介绍批处理if语句的基本用法(4种基本用法+3种高级用法),其中包含如何使用if语句嵌套和flag标签(或多个if语句)来表示“且”和“或”的逻辑关系。
那么我们开始吧!一、if语句的4种基本语法结构1.用于判断两个字符串(或变量)是否相等语法结构:if [not] str1==str2 命令语句功能:如果str1和str2相等,则执行后面的命令语句。
案例:判断从用户输入接收的两个变量是否相等,如果相等则返回“您输入的两个值相等!”的提示文字。
@echo offset /p num1=请您键入第一个变量的值:set /p num2=请您键入第二个变量的值:if %num1%==%num2% echo 您输入的两个值相等!pause注:1.虽然这里是以数值型变量为例,但是换成字符串变量也是可以这样使用的;2.在给变量赋值时,两端无须加一对%,但是在引用变量中的值的时候,两端必须加一对%;上面的例子是判断两者是否“相等”,那么能否判断两者是否“不相等”呢?一般有两种方法来判断两者是否“不相等”:①if %num1% NEQ %num2% echo 您输入的两个值不相等!即:使用比较运算符NEQ来表示“不等于”的概念,这很好理解。
②if not %num1%==%num2% echo 您输入的两个值不相等!即:使用not对两者相等来取反,表示“不相等”的概念。
*拓展延申1.和if常常搭配的比较运算符,共有6种,分别是:①EQU(表示“是否等于”的意思,和符号==相对应)②NEQ(表示“是否不等于”的意思)③GTR(表示“是否大于”的意思)④GEQ(表示“是否大于或等于”的意思)⑤LSS(表示“是否小于”的意思)⑥LEQ(表示“是否小于或等于”的意思)2.关于if语句的/i模式:用于判断时忽略大小写的区别if “A”==“a” echo两者相等!以上语句不会执行后面的命令语句,因为显而易见a和A不相同。
批处理函数
批处理函数是可在批处理脚本中调用的一组命令。
它们通常用于执行
特定的任务或操作,例如文件复制、打开某个应用程序或删除某个文件等。
以下是一些常见的批处理函数:
1.ECHO:在命令窗口中显示文本或值。
2.CD:更改当前文件夹。
3.DIR:列出当前文件夹中的文件和子文件夹。
4.COPY:将一个或多个文件从一个位置复制到另一个位置。
5.DEL:删除文件或文件夹。
6.MD:创建一个新文件夹。
7.TYPE:显示文本文件中的内容。
8.SET:设置或显示环境变量。
9.FOR:执行一个或多个命令,并对一组文件或文件夹执行操作。
10.CALL:在批处理文件中调用另一个程序或批处理文件。
11.IF:测试条件并执行相应的命令。
这些函数可用于组合为复杂的批处理脚本,以自动化各种任务和操作。