标题: [其他] 用批处理比较输入的数字大小和截取字符串 [打印本页]
作者: leikaihua 时间: 2009-1-17 10:09 标题: 用批处理比较输入的数字大小和截取字符串
问题是这样
累加问题
shutdown -s -t 600
echo 如果不输入在10分钟后关机
set /p a=
echo %date%%time%数量为:%a%>数量.txt
shutdown -a
2009-01-15 星期四 9:10:24.23数量为:204199
2009-01-16 星期五 8:32:22.85数量为:204202
2009-01-17 星期六 8:19:51.12数量为:204303
这样每天都需要输入数量,由于每天的数量都会增加往后的天数的数量肯定比前一天大,由于有的人不认真,随便乱输入一个数字,结果批处理也就记住了并且不关机,于是设置条件,如果输入字母,符号都不执行shutdown -a 并且如果输入的数字小于前一天的仍然不执行shutdown -a
作者: shqf 时间: 2009-1-17 14:46
实在无法理解楼主的意
作者: leikaihua 时间: 2009-1-17 16:19
shutdown -s -t 600
echo 如果不输入在10分钟后关机
set /p a=
echo %date%%time%数量为:%a%>>数量.txt
shutdown -a
上面为批处理
运行之后 则会 让你输入数字
然后
2009-01-15 星期四 9:10:24.23数量为:204199
2009-01-16 星期五 8:32:22.85数量为:204202
2009-01-17 星期六 8:19:51.12数量为:204303
这些都是输入的记录 都是 数量.txt的记录
但是这个批处理 如果 输入字母 或者随便乱输入 都会记录
但是我要的仅仅是数字 就是说 比如今天 是 2009-1-01-18 那么 输入的数字肯定大于 204303 但是我的上面批处理 现在做不到 判断 请高手完善
作者: defanive 时间: 2009-1-17 19:04 标题: 思路&代码
楼主要实现的功能有两个:读取数字、过滤英文字母(我的代码特殊字符也过滤掉了)、判断数字大小
首先要读取昨天的数量
可以看到楼主的文件很有规律,前面部分对我们的批处理无关,后数字是全角“:”后面的部分
那么利用 for 的分隔符 delims 功能,把分隔符设置为“:”,这样文件的每一行就被我们割成了两部分,一部分是“:”前面的日期等,另一部分就是“:”后面的数字
从文本可以看出,越往下的行时间越晚,那么最后一行的数字必定是我们想要的,那么上面割出来的第一部分就可以不要了,用 tokens 功能,只留下第二部分
最后保存到变量里面,直接用 set 就可以了,下一行的数字会覆盖上一行的数字,这样就读出了最后一行的数字
那么就要过滤掉英文字母还有其他乱七八糟的东西
set 的 /a 功能是数值计算,所以给变量赋值的时候必定是数字,这样就实现了过滤的功能(顺带还支持计算了,输入204000+500也可以,得到结果204500)
判断数字大小
直接用 if 比较就可以了,如果小于的话就跳转到开头部分继续输入,否则的话就取消关机等动作
另外纠正一个,你 echo 的时候用的是 > ,这样会清空上次的记录,我的代码里面已经改过来了
- @echo off
- shutdown -s -t 600
- for /f "tokens=2 delims=:" %%a in (数量.txt) do set "last=%%a"
- :loop
- cls
- echo 如果不输入在10分钟后关机
- set /p a=
- set /a "a=a"
- if %a% leq %last% goto loop
- echo %date%%time%数量为:%a%>>数量.txt
- shutdown -a
复制代码
作者: leikaihua 时间: 2009-1-17 19:16
不好意思, 这位老师 我有个地方不懂,
就是
set /a "a=a"
这句 什么意思 用意是 那个作用,我的只是比较浅薄,希望能讲的多一点
作者: defanive 时间: 2009-1-17 20:48
这个嘛,可以查找关于set的资料,也可以在CMD里面输入set /?
set a=1+1
set /a a=1+1
第一句中a被赋值为1+1,而第二句中a被赋值为2
/a就是把等号后面的内容作为数字、表达式,计算出结果后再赋值给变量
set a=a
set /a a=a
set /a a=%a%
第一句中a被赋值为字母a,第二三句中,如果变量a原来等于2,那么赋值后a还是为2
在set /a中,等号右边变量可以作为环境变量来用。通俗点,就是不用加等号
那么给变量赋值为自身没有改变变量值的大小,但是/a只允许等号右边为数字或表达式,因此无关字符就被过滤掉了
set a=1&echo %a%
set "a=1&echo %a%"
第一句执行显示1,批处理解析为set a=1和echo %a%这两个分句,而第二句什么也不显示,因为有双引号引住了等式,把a=1&echo %a%作为一个参数传递给set。这就像start "D:\a b.bat"而不是start D:\a b.bat
现在你能明白了吧
作者: liziyall 时间: 2022-4-30 16:22
本帖最后由 liziyall 于 2022-4-30 16:29 编辑
本人研究出来的通用格式:
通用格式:
①set str=%str:~起始位m,取舍数n%
注解:(n为正整数时表示从m位开始向右取n个字符;n为负数时表示从最后 一位开始向左舍弃n个字符;当n为0时不会截取任何字符,即:str=空值。)
②set str=%str:~起始位m% 注解:(不管m是正还是负都表示截取m位和其后的所有字符)
通用原则:
①字符串的排位:从左到右依次为第0位、第1位、第2位...;从右到左依次为第-1位、第-2位、第-3位...。
②截取过程:先截取再取舍。第一步:先截取起始位之后的所有字符串(包括起始位)。第二步:再对截取到的字符串进行取舍。具体是取还是舍看n的值,如果n为正数负数或0请看格式①和注解,如果n参数没有请看格式②和注解。
例如:- @echo off
- set str=123456789
- set str=%str:~3,0%
- echo %str%
- pause
复制代码
结果显示ECHO处于关闭状态。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |