[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
我是老老实实的算的。。a为变量。。
  1. @echo off
  2. set a=-2000000
  3. set /a b=a/1000
  4. set /a c=a/1000000
  5. if %b%==0 (echo %a%) else (
  6. if %c%==0 (echo %a:~0,-3%,%a:~-3%) else (echo %a:~0,-6%,%a:~-3,3%,%a:~-3%))
复制代码

TOP

本帖最后由 sishentibu 于 2016-3-9 11:52 编辑

回复 9# happy886rr

有个地方写错了。
  1.     @echo off
  2.     set a=1000052
  3.     set /a b=a/1000
  4.     set /a c=a/1000000
  5.     if %b%==0 (echo %a%) else (
  6.             if %c%==0 (echo %a:~0,-3%,%a:~-3%) else (echo %a:~0,-6%,%a:~-6,3%,%a:~-3%))
复制代码
最后一个echo改下就好了

TOP

本帖最后由 sishentibu 于 2016-3-10 20:56 编辑

回复 18# happy886rr


抱歉,开始想错了。

set num=!num:~0,-3!
如果num只有2位数,是不是num就为空了?就是"!num!"=="" ?

TOP

回复 21# happy886rr

你那割法是真巧妙,按我那写法,位数一多就抗不住了。
想了下,你这种写法,只要是有规律的分割都可以啊,不仅仅是数字

TOP

回复 22# happy886rr

我又有疑问了。。
第一遍执行的时候,set p1=,!num:~-3!!p1! ,p1不是还没有定义吗,难道后方的那个p1直接为空?
上面的还能解释的话,set p1=!p1:-,^=-! 就有些不太明白了。一般情况下,不是!p1:-,=-! 吗?为什么会多了个^,这个不是转义用的吗?
我去掉^的情况下,批处理还是正常运行了。。然后按我的理解,!p1:-,^=-!不是语法不对吗。。。

TOP

回复 24# happy886rr
Set str=%str=-% 类似这种,不是set的本来用法吗,你这种写法我反而没看懂。。
也就是说,从结果来说,加不加^都可以的吧?

TOP

回复 26# happy886rr

好吧。
那是不是加了^, 就是我们所需要的那个赋值符号?
但一般来说,用^转义了后,不是普通的一个字符吗

TOP

回复 28# happy886rr


    29#的CrLf貌似提出异议了。不过我看的有点晕,暂时不去研究那个了
关于截断,我还有个问题请教下
例如
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in ("123465") do (
  4. echo %%i
  5. set a=%%i
  6. echo !a:~0,2!)
  7. pause
复制代码
这个可以不可以没有set a=%%i 这一步的?我自己试不出来。

TOP

回复 31# happy886rr


    你研究的可够多的
批处理按行处理,这个我在论坛的基础教程里面有看到过的。
而且,我现在处理的东西都比较小,所以对于效率这块不是很注意。虽然我看到很多说goto的效率低,但我个人感觉,写成goto的形式,对于分类处理的东西更好写。。
另外,批处理有没有类似按行运行的办法的?因为我不是很熟悉,经常要把批处理改很多次才能达到最终要求。试过加pause,但行数一多就感觉好麻烦。而且有时碰到一闪而过的,更不好判断哪里的问题了

TOP

回复 33# happy886rr
没懂。。可以帮我举个例子吗,就用楼上你写的代码

刚才写的时候又碰到个问题。关于时间的处理的。
手动设置t1,t2时间,然后用下面代码是可以的
  1. set /a t=(%t2:~0,2%-%t1:~0,2%)*60+(%t2:~3,2%-%t1:~3,2%)
复制代码
但我在for /f 语句中,读取到时间,对时间进行计算就变成一闪而过了,这个哪里有问题?
  1. set /a t=(!t2:~0,2!-!t1:~0,2!)*60+(!t2:~3,2!-!t1:~3,2!)
复制代码

TOP

回复 35# happy886rr


    这个我倒是没注意,我晚上加1试试
不过有2个问题,我看CrLf 貌似有不同意见
还有,我自己在win7下试过,貌似截取出来的是“ 8:30" 类似的,而不是”08:30“,就是直接为空的,而不是0

另外,那个给批处理加暂停的那个解释我没看懂啊

TOP

回复 39# CrLf


    反括号指的是 ) ?
刚才查了下,貌似是说,第一个)会去跟 do ( 这个括号配对去了。
对于进行转义,我还是有点疑惑。
转义的意思,不是把特殊作用的字符,转换成普通显示的字符吗?
但我实际中,是需要它在for内部跟前一个(配对。如果把)转义成普通字符了,那这个)还会跟前一个(配对?
如果语句写的比较复杂,括号套括号的时候,是不是同样也有这个问题?如果有三层,四层括号,按这个逻辑,貌似就算加了转义,里面的配对情况依然会乱吧?

TOP

回复 42# happy886rr

这两天头痛,懒的测试。我过几天在在虚拟机中改系统时间测试下

“第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。”,我明白你要表达的意思,但是我不会。。。
目前我就是for,set,echo,if 之类的用的多点,findstr之类的基本就没用过。。

TOP

回复 45# happy886rr


    我直接拿来测试了下,稍微有点问题。
  1. echo echo ----^>第!i!行
复制代码
这里的>貌似有点问题,有这个的时候,我处理后的批处理运行不了,去掉就好了(虽然我知道这个只是显示用的)

另外,你说的“处理另一个批处理时遇到!!或者%%号就扩展了”不的很清楚表达的意义,但实际情况确实是包含%%的批处理无法处理,直接一闪而过了。例如
  1. @echo off
  2. set /p=<nul >url.txt
  3. for /f %%i in (dnsserver.txt) do (
  4. echo %%i>>url.txt
  5. echo %%ipage/2/>>url.txt
  6. echo %%ipage/3/>>url.txt)
复制代码
看了处理结果后,我感觉是不是可以不用这么麻烦。因为序号是一行一个,for /f也是一次读取一行,那么直接计数不就好了吗,也就不用读取行号了。

对于这种方法,我简单的测试了下。对于正确的地方没的说。但是错误的地方,如果有括号的,如for之类的,是不是只要括号中的内容有误,就直接退出了?然后我就可以先检查这个语句?

TOP

回复 47# happy886rr


    我想了下,貌似出问题的,基本都会有%%,!!之类的。然后这类却不支持。。。

TOP

返回列表