中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-27 05:18
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 简介批处理中数字(值)的处理方法: 查看 1,952 回复 10
楼 主 简介批处理中数字(值)的处理方法: 发表于 2008-04-18 15:12 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
&&我们在批处理中经常要遇到数字(值)的处理,下面我就简单讲一下批处理中数字(值)处理方法:
一、随机数
  在系统变量中有一个随机取值的变量%random%,其为0-32767之间的十进制数字,利用这个变量我们就能取得我们想要的任一组随机数字(等下会说明方法)。
二、四则运算
  如我们要对一个变量(数值)进行运算,则可使用set /a命令,如:set /a str+=1就是把变量str的数值加上1,同样只要把这个命令中的+改成-、*、/就可以完成对该数值的减1、乘1、除1运算了,而更重要的是我们可以通过set /a命令来进行四则运算,如:set /a str=5*6+4*3-2*7,也可以进行变量和变量间的四则运算,如:set /a str=%a%/%b%*%c%-%d%,但要注意一点:运算仅限于整数,如要对小数进行运算可先乘上10的n次方。
三、取余
  所谓余数就是除数除以被除数剩下的值,在批处理中取余运算符是用%%来表示的,如:%random%%%56就是把不断地把随机数除以56取余数,得到的数值一定是处在0-55间的,那么我们只要set /a a=%random%%%56就能把变量a的值设定在0-55间(大家想一下为什么a不会等于56),如要把a设定在1-56间,则只需set /a a=%random%%%56+1,我们了解了这点是很重要的,如要随机设定一台机器的ip(假设4个数值都随机取定)则只需写下以下代码(设置部分略去):
@echo off
set /a a=%random%%%256,b=%random%%%256,c=%random%%%256,d=%random%%%256
set ip=%a%.%b%.%c%.%d%
netsh interface...

四、去零
  数值去零一般是运用在时间计算上,因时间显示一般都是两位不足两位的自动在个位前补零,如07:04:01,这就给我们在运算中带来麻烦,所以对时间进行运算应该先去零,方法其实也很简单,就是利用取余运算,如要对08去零则只在08前面加上10变成108再不断地除以10余数肯定是8,如时间变量a(值为08)的运算公式为:set /a a=10%a%%%10,但时间是有两位数的,因此要将上面的公式变为set /a a=100%a%%%100,现在我们对上面的07:04:01进行取零,代码如下:
@echo off
set str=07:04:01
for /f "delims=: tokens=1-3" %%a in ("%str%") do (
set /a a=100%%a%%100,b=100%%b%%100,c=100%%c%%100
)
echo %a%:%b%:%c%&pause>nul

最后显示的结果就是7:4:1。
五、递加(减、乘、除)运算
  在批处理中我们经常要用到递加(减、乘、除)的运算,那怎么实现呢?只有通过循环来实现,有两种循环的方法:一种是for循环,一种是goto循环。如我们要对一个数值5进行递加100次变成105,两种方法的代码如下:
1.for循环
@echo off
set n=5
for /l %%i in (1,1,100) do set /a n+=1
echo %n%&pause>nul

  2.goto循环
@echo off
set n=5
:begin
set /a n+=1
if %n% neq 105 goto begin
echo %n%&pause>nul

同理可实现递减、乘、除和重复四则运算。
  我也就简单讲这么多了,主要是想给初学批处理的新手以自己微薄的帮助,还望各位高人予以补充和指教。

[ Last edited by zw19750516 on 2008-6-23 at 06:04 PM ]
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
huahua0919 +5 2008-04-18 16:18
lxmxn +8 2008-04-19 12:27
pusofalse +6 2008-05-28 23:55
批处理之家新域名:www.bathome.net
2 发表于 2008-04-18 16:17 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
但要注意两点:1.=号左边的变量是不加符号%的,而右边的变量则必须加
set a=abc
set /a %a:~0,1%+=1

[ Last edited by huahua0919 on 2008-4-19 at 01:17 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +5 2008-04-18 20:44
3 谢谢: 发表于 2008-04-18 20:43 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
多谢指出,已修改。
批处理之家新域名:www.bathome.net
4 发表于 2008-04-19 12:27 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
不错的基础教程。

不过有些地方需要注意一下:
但要注意两点:1.=号左边的变量一般是不加符号%的(在通过截取字符获得变量时会有如%~a,2%的表达示),而右边的变量则必须加;

在做算术运算时,右边的变量可以不必加符号%,加了反而使表达式的易读性降低了。

@echo off

set /a a=1,b=2,c=3,d=4
set /a num=(a+b)*c %% d

echo num is %num%
pause


另外,2 楼的 “set /a %a:~0,1%+=1” 貌似是个错误的表达式。
5 发表于 2008-04-19 12:43 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
回斑竹,以前我也没接触过,不过看zh159写过才豁然开朗的
现贴出代码


@echo off
set "str=aferefwfwerergrgreaaffwafwa"
set/p= %str% 中有<nul
:loop
set /a %str:~0,1%+=1&set str=%str:~1%&if defined str goto loop
echo a %a% 个
pause
6 发表于 2008-04-19 12:55 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by huahua0919 at 2008-4-19 12:43:
回斑竹,以前我也没接触过,不过看zh159写过才豁然开朗的
现贴出代码


@echo off
set "str=aferefwfwerergrgreaaffwafwa"
set/p= %str% 中有<nul
:loop ...

这个要根据情况来定,zh159 那个的 str 是一个字符串变量,所以截取之后可以为其中的子字符串变量赋值,但是如果你这里的 a 变量是个数值不就会报错了吗?
7 发表于 2008-04-19 13:16 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
这个当然会报错误
只是说明楼主的一个变量形式
已经改正
8 发表于 2008-05-28 23:09 ·  中国 天津 联通
初级用户
★★
积分 173
发帖 69
注册 2007-08-07 22:40
18年会员
UID 94807
性别 男
状态 离线
顶下,谢楼主好
9 发表于 2008-05-29 12:12 ·  中国 广东 广州 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
四、去零
  数值去零一般是运用在时间计算上,因时间显示一般都是两位不足两位的自动在个位前补零,如07:04:01,这就给我们在运算中带来麻烦,所以对时间进行运算应该先去零,方法其实也很简单,就是利用取余运算,如要对08去零则只在08前面加上10变成108再不断地除以10余数肯定是8,如时间变量a(值为08)的运算公式为:set /a a=10%a%%%10,但时间是有两位数的,因此要将上面的公式变为set /a a=100%a%%%100,现在我们对上面的07:04:01进行取零......

本来就对这里的计算有一些想法的,不过不想说出来罢了,但看到LZ人气不盛的帖子后决定谈谈自己的一些看法,其实楼主红色部分的描述有一些失误,要把08去0,只须在08之前加1再取其除以100的余数即可,即所举的例子改为以下就可以了(效率要高一点点,虽然并不明显):
@echo off
set str=07:04:01
for /f "delims=: tokens=1-3" %%a in ("%str%") do (
set /a a=1%%a%%100,b=1%%b%%100,c=1%%c%%100
)
echo %a%:%b%:%c%&pause>nul

不过本人对时间的计算并不是采取取余的方法,如下:
@echo off
set aa=12345
:again
set /a ab=%random%%%5
call set times_=%%aa:~%ab%,1%%
:begin
if not "%time:~-3%"==".00" goto begin
set time_b=%time%

::在这里插入要运行的代码即可计算其运行的时间
echo.&echo ping -n %times_% 127.1^>nul 的运行时间如下
ping -n %times_% 127.1>nul

::下面计算运行代码花费的时间
set time_e=%time%
set min_b=1%time_b:~3,2%
set sec_b=1%time_b:~6,2%
set min_e=1%time_e:~3,2%
set sec_e=1%time_e:~6,2%
if %sec_e% lss %sec_b% (
if %min_e% lss %min_b% (
set /a sec_e+=60&set /a min_e+=59
) else (
set /a sec_e+=60&set /a min_e-=1
)
)
set /a min_used=%min_e%-%min_b%
set /a sec_used=%sec_e%-%sec_b%
echo.
echo 开始时间:%time_b%
echo 结束时间:%time_e%
echo 运行时间为: %min_used:~-2%分 %sec_used:~-2%.%time_e:~-2%秒
echo.&pause&cls&goto :again
10 发表于 2008-09-05 15:49 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 17
注册 2008-08-27 16:32
17年会员
UID 124308
性别 男
状态 离线
如果一个4位数,前面有可能有1~3个0,怎么自适应去0?
11 Re 10楼 发表于 2008-09-05 16:23 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@echo off
set num=0001
set /a num=1000%num%%%10000
echo %num%
pause
论坛跳转: