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

[其他] 用批处理比较输入的数字大小和截取字符串

问题是这样
累加问题
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

实在无法理解楼主的意

TOP

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  但是我的上面批处理 现在做不到 判断  请高手完善

TOP

思路&代码

楼主要实现的功能有两个:读取数字、过滤英文字母(我的代码特殊字符也过滤掉了)、判断数字大小


首先要读取昨天的数量
可以看到楼主的文件很有规律,前面部分对我们的批处理无关,后数字是全角“:”后面的部分
那么利用 for 的分隔符 delims 功能,把分隔符设置为“:”,这样文件的每一行就被我们割成了两部分,一部分是“:”前面的日期等,另一部分就是“:”后面的数字
从文本可以看出,越往下的行时间越晚,那么最后一行的数字必定是我们想要的,那么上面割出来的第一部分就可以不要了,用 tokens 功能,只留下第二部分
最后保存到变量里面,直接用 set 就可以了,下一行的数字会覆盖上一行的数字,这样就读出了最后一行的数字

那么就要过滤掉英文字母还有其他乱七八糟的东西
set 的 /a 功能是数值计算,所以给变量赋值的时候必定是数字,这样就实现了过滤的功能(顺带还支持计算了,输入204000+500也可以,得到结果204500)

判断数字大小
直接用 if 比较就可以了,如果小于的话就跳转到开头部分继续输入,否则的话就取消关机等动作

另外纠正一个,你 echo 的时候用的是 > ,这样会清空上次的记录,我的代码里面已经改过来了

  1. @echo off
  2. shutdown -s -t  600
  3. for /f "tokens=2 delims=:" %%a in (数量.txt) do set "last=%%a"
  4. :loop
  5. cls
  6. echo 如果不输入在10分钟后关机
  7. set /p a=
  8. set /a "a=a"
  9. if %a% leq %last% goto loop
  10. echo %date%%time%数量为:%a%>>数量.txt
  11. shutdown -a
复制代码
1

评分人数

    • 5i365: 技术牛X, 感谢分享技术 + 1

TOP

不好意思, 这位老师 我有个地方不懂,
就是
set /a "a=a"
这句 什么意思 用意是 那个作用,我的只是比较浅薄,希望能讲的多一点

TOP

这个嘛,可以查找关于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

现在你能明白了吧

TOP

本帖最后由 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参数没有请看格式②和注解。
例如:
  1. @echo off
  2. set str=123456789
  3. set str=%str:~3,0%
  4. echo %str%
  5. pause
复制代码
结果显示ECHO处于关闭状态。

TOP

返回列表