Board logo

标题: [其他] [已解决]批处理命令在FOR里面IF判断问题 [打印本页]

作者: x8520x    时间: 2015-9-23 08:29     标题: [已解决]批处理命令在FOR里面IF判断问题

  1. @echo off
  2. ::本地变量开启,不开启无法在FOR里使用set /a
  3. setlocal enabledelayedexpansion
  4. ::总地址,自行修改
  5. set us1=http://tkpic.tukucc.com/4700/20140913/c_
  6. ::开始地址,自行修改
  7. set us2=170730
  8. ::结束地址,自行修改
  9. set us3=170749
  10. ::名称,自行修改
  11. set name1=斗罗大陆
  12. ::类型,不用改,除非下载的不是图片,但如果不是图片不保证能正常使用
  13. set type1=漫画
  14. set a1=9
  15. set a2=99
  16. for /l %%b in (%us2%,1,%us3%) do (
  17. ::当前卷本话,自行修改
  18. set /a num2=us2-170718
  19. echo.
  20. echo 现在处理!num2!
  21. ::文件名少于两位数,开头加a排序,不用改,除非有强逼症喜欢全数字,但改后不保证能正常运行
  22. if "!num2!" LSS "!a1!" (set zf=a) else if /i "!num2!" LEQ "!a2!" (set zf=b) else set zf=c
  23. echo !num2!
  24. echo !a1!
  25. echo !zf!
  26. pause
  27. echo.
  28. set /p pnum=页数最大值
  29. echo ^<pre^>>>"%name1% %type1% !zf!%num2%.html"
  30. for /l %%a in (1,1,!pnum!) do (
  31. ::文件名默认是三位数的,数量少于10,开头加00排序,如果某些文件名不足三位数,如01,02,自行修改去掉一个0
  32. if /i "!pnum!" LEQ "9" (set num1=00) else (if /i "!pnum!" LEQ "99" (set num1=0) else (set num1=""))
  33. echo ^<img src^=^"%us1%%%b/%num1%%%a.jpg^"^>>>"%name1% %type1% !zf!%num2%.html"
  34. set /a us2+=1
  35. echo !us2!
  36. pause
  37. )
  38. echo ^<^/pre^>>>"%name1% %type1% !zf!%num2%.html"
  39. echo.
  40. echo 刚刚完全 %num2%
  41. )
  42. pause
复制代码
已知问题所在
if "!num2!" LSS "!a1!" (set zf=a) else if /i "!num2!" LEQ "!a2!" (set zf=b) else set zf=c
if /i "!pnum!" LEQ "9" (set num1=00) else (if /i "!pnum!" LEQ "99" (set num1=0) else (set num1=""))
此两行代码想到的和百度到的都试过了,就是不行
问题1:"!num2!"和"!pnum!"大于9为真时zf依然是a
问题2:修改后!num2!"和"!pnum!"大于9为真时zf是b,但同时不知为何会判断是大于99为真,接着zf变成c



管理员说:开启变量,用!!依然未解决
5楼说:补位法,问题解决
就是不知道为何在FOR里IF后SET会出现问题
虽然用补位解决了FOR里IF的问题,但是却出现了另一外问题,在FOR外面的IF竟然失效了
另外,我自己发 的帖,如果是已解决,我竟然没权限看,为什么啊……



问题所在:
1,代码问题
2,系统问题,代码屡次修改后在实体机WIN8仍出问题,心血来潮在虚拟机XP测试,成功!成功代码在最后自己的回复里!
@Batcher
作者: Batcher    时间: 2015-9-23 08:40

数字比较不要加双引号,if命令教程的第15页有介绍:
http://bbs.bathome.net/thread-31727-1-1.html
作者: x8520x    时间: 2015-9-23 10:03

回复 2# Batcher


   


@echo off
rem setlocal enabledelayedexpansion
set a1=170730
set a2=170749
set /a a3=a1-170718
set a4=http://tkpic.tukucc.com/4700/20140913/c_
set a5=斗罗大陆
set a6=漫画

:s1
echo.
echo 现在处理%a3%
if "%a3%" GTR "9" (set a7=a) else if "%a3%" GTR "99" (set a7=b) else set a7=c
echo.
set /p a8=页数最大值
echo ^<pre^>>> "%a5% %a6% %a7%%a3%.html"
for /l %%a in (1,1,%a8%) do (
echo %%a
if %%a gtr 9 (set a9=0) else if %%a gtr 99 (set a9=) else set a9=00
echo ^<img src^=^"%a4%%a1%/%a9%%%a.jpg^"^>>> "%a5% %a6% %a7%%a3%.html"
)
echo ^<^/pre^>>> "%a5% %a6% %a7%%a3%.html"
if "a1" == "a2" (
exit
) else (
set /a a1=a1+1
set /a a3=a3+1
goto s1
)

已经试过了,在FOR里面IF时一永远是A,要不就先变B再变C,如果不在FOR里面IF却没这问题
标题错了,我改改
这个是我自己修改后的代码
输出是1,2,3……10,11,12
而不是001,002,003……010,011,012
作者: Batcher    时间: 2015-9-23 10:24

回复 3# x8520x


启用变量延迟扩展
变量使用感叹号 !a9!
作者: flyinnet9    时间: 2015-9-23 10:33

嗯。。。要补位还有其他方法
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p num=输入1-99的任意值:
  4. set num=00%num%
  5. set num=!num:~-3!
  6. echo 补位后的值:!num!
复制代码

作者: x8520x    时间: 2015-9-23 10:54

回复 5# flyinnet9


    @echo off
setlocal enabledelayedexpansion
set a1=170730
set a2=170749
set /a a3=a1-170718
set a4=http://tkpic.tukucc.com/4700/20140913/c_
set a5=斗罗大陆
set a6=漫画
set aa="%a5% %a6% %a7%%a3%.html"
:s1
echo.
echo 现在处理%a3%
if "%a3%" GTR "9" (set a7=a) else if "%a3%" GTR "99" (set a7=b) else set a7=c
echo.
set /p a8=页数最大值
echo ^<pre^>>>%aa%
for /l %%a in (1,1,%a8%) do (
set a9=0000%%a
set a9=!a9:~-3!
echo ^<img src^=^"%a4%%a1%/!a9!.jpg^"^>>>%aa%
)
echo ^<^/pre^>>>%aa%
if "a1" == "a2" (
exit
) else (
set /a a1=a1+1
set /a a3=a3+1
goto s1
)

开启变量是解决了FOR里IF问题
但是文件名却没有了ABC
作者: flyinnet9    时间: 2015-9-23 11:13

abc是啥?哪里给abc赋过值??
作者: x8520x    时间: 2015-9-23 11:20

回复 7# flyinnet9


    我前面做了一个IF,如果数值小于或等于9,就是单位数,文件名就是a9,如果是双位数10,文件名就是B10
但使用setlocal enabledelayedexpansion开启变量后,文件名只能是9,10或是c9,c10
作者: Batcher    时间: 2015-9-23 11:20

回复 6# x8520x


代码的问题太多了,我改了几个你先试试
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set a1=170730
  4. set a2=170749
  5. set /a a3=a1-170718
  6. set a4=http://tkpic.tukucc.com/4700/20140913/c_
  7. set a5=斗罗大陆
  8. set a6=漫画
  9. :s1
  10. echo.
  11. echo 现在处理!a3!
  12. if !a3! GTR 9 (set a7=a) else if !a3! GTR 99 (set a7=b) else set a7=c
  13. set aa="%a5% %a6% !a7!!a3!.html"
  14. echo.
  15. set /p a8=页数最大值
  16. echo ^<pre^>>>!aa!
  17. for /l %%a in (1,1,!a8!) do (
  18.     set a9=0000%%a
  19.     set a9=!a9:~-3!
  20.     echo ^<img src^=^"%a4%!a1!/!a9!.jpg^"^>>>!aa!
  21. )
  22. echo ^<^/pre^>>>!aa!
  23. if "!a1!" == "!a2!" (
  24.     exit
  25. ) else (
  26.     set /a a1=a1+1
  27.     set /a a3=a3+1
  28.     goto s1
  29. )
复制代码

作者: x8520x    时间: 2015-9-23 11:29

回复 9# Batcher


    管理员,这个代码我试过了,数值是9或10,文件名前面都是A,没办法A9B10,这个是开启变量延迟后出现的,但如果不开启,就无法补位。
现在我只想到如果用CALL batfile能不能解决,如果解决了,估计要用ECHO写一直创建两个BATFILE的BATFILE,这样文件就大了……我哭。。。。。。
作者: Batcher    时间: 2015-9-23 12:25

回复 10# x8520x


    运行9楼的代码,你输入的值是什么?希望得到的值是什么?实际得到值是什么?我也试试
作者: x8520x    时间: 2015-9-23 16:47

回复 11# Batcher


    第一个输入的数值是文件名,如果单位数值是1到9,文件名则为斗罗大陆 漫画 a1.tml,如果是双位数值是10到99,文件名则为斗罗大陆 漫画 b10.html
第二个输入的数值是图片排序名,如果是单位数值1到9的话,图片文件名则为001.jpg,如果是双位数值是10到99,文件名则为010.jpg
作者: flyinnet9    时间: 2015-9-23 16:59

本帖最后由 flyinnet9 于 2015-9-23 17:01 编辑

回复 10# x8520x


与a\b\c相关的文件名后缀是html,相关变量是a7,a3决定a7的值
a3=a1-170718,a3最少等于12,a7=a



set /a a1=a1+1
set /a a3=a3+1
if "!a1!" == "!a2!" exit
a2-a1=19,程序退出
a3最大值:a3=12+19=31 a7=a

最终结论:变量a7只可能等于a

没分析错吧?我真无聊。。。。。。。
作者: x8520x    时间: 2015-9-23 21:11

回复 13# flyinnet9

那个不要去在意a1和a3的值,a1初始值170719,这样运算后a3的值是1
    开启变量后,数值无论是单位数或双位数,文件名都是a1到a99,其实我是想单位数的话前面加a,双位数加b
作者: flyinnet9    时间: 2015-9-23 23:21

12行不要,改成下面2行
set /a mod=!a3!%%2
if !mod!==0 (set a7=b) else set a7=a

一次挤一点需求。。。。
不会写的话最好一次说清楚需求,让别人写,然后自己也写一个,与自己写的对照找区别,慢慢学
写个半拉子的代码然后让别人改很麻烦的,又要读程序,还要揣摩你的需求
作者: x8520x    时间: 2015-9-24 11:24

本帖最后由 x8520x 于 2015-9-24 11:33 编辑

回复 15# flyinnet9


    首先,我谢谢你的热心帮助,但是请问你帮我的时候有尝试运行代码测试吗?
最初我是想解决在FOR里面的IF问题,此问题是文件内容,使用setlocal enabledelayedexpansion,补位法确定解决了,但在FOR外面的IF却不再生效了,此问题是html文件名称问题
你在最后说将12行换成
set /a mod=!a3!%%2
if !mod!==0 (set a7=b) else set a7=a
HTML文件内容是正常的,因为使用了setlocal enabledelayedexpansion
但文件名不正常!!
斗罗大陆 漫画 a7.html
斗罗大陆 漫画 b8.html
斗罗大陆 漫画 a9.html
斗罗大陆 漫画 b10.html


对于我自己代码,一可能是我自己没写好了,二估计是我的电脑问题,因为以下代码在XP虚拟机实现了我想要的,但在实体机WIN8却出错
XP结果:
小于10,即是个位数
斗罗大陆 漫画 a7.html
斗罗大陆 漫画 a8.html
斗罗大陆 漫画 a9.html
大于9,小于100,即是十位数
斗罗大陆 漫画 b10.html
斗罗大陆 漫画 b11.html
斗罗大陆 漫画 b12.html

而HTML内容,前面的HTTP请无视:
小于10,即是个位数
007.jpg
008.jpg
009.jpg
大于9,小于100,即是十位数
010.jpg
011.jpg
012.jpg


win8不成功,原因未确定!
使用:setlocal enabledelayedexpansion
无论   小于10,即是个位数    或    大于9而小于100,即是十位数
结果1
斗罗大陆 漫画 a9.html
斗罗大陆 漫画 a10.html
结果2
斗罗大陆 漫画 c9.html
斗罗大陆 漫画 c10.html
结果3
斗罗大陆 漫画 9.html
斗罗大陆 漫画 10.html

而文件内容是正常!!
而HTML内容,前面的HTTP请无视:
小于10,即是个位数
007.jpg
008.jpg
009.jpg
大于9,小于100,即是十位数
010.jpg
011.jpg
012.jpg


------------------------------------------------------

@echo off
setlocal enabledelayedexpansion
set a1=170725
set a2=170730
set /a a3=a1-170718
set a4=http://tkpic.tukucc.com/4700/20140913/c_
set a5=斗罗大陆
set a6=漫画

:s1
echo.
echo 现在处理%a3%
if %a3% LSS 10 (set a7=a) else if %a3% LSS 100 (set a7=b) else set a7=c
echo.
set /p a8=页数最大值
echo ^<pre^>>> "%a5% %a6% %a7%%a3%.html"
for /l %%a in (1,1,%a8%) do (
echo %%a
set a9=0000%%a
set a9=!a9:~-3!
echo ^<img src^=^"%a4%%a1%/!a9!.jpg^"^>>> "%a5% %a6% %a7%%a3%.html"
)
echo ^<^/pre^>>> "%a5% %a6% %a7%%a3%.html"
if %a1% == %a2% (
exit
) else (
set /a a1=a1+1
set /a a3=a3+1
goto s1
)




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2