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

[其他] 批处理脚本中有for循环,循环后语句不执行原因找不到

  1. rem 作了实现自动备份网络交换机配置的BAT,原本1个bat负责生成登录VBS,另一个bat负责执行VBS,成功后尝试将2个bat合并为1个bat。但合并后第二个for后任何语句都未被执行?找不到原因
  2. rem 测试环境win7_32,win7_64
  3. rem 0_SW_QB.txt文件内容
  4. rem 思科 10.131.55.252 name mima
  5. rem 华为 10.131.55.251 name mima
  6. @echo off
  7. setlocal EnableDelayedExpansion
  8. rem 本目录下有my_tftp_ip.txt则读其内容,否则就使用10.131.55.65作为tftp地址
  9. if exist "%~dp0my_tftp_ip.txt" (
  10.    for /f "tokens=1 delims=" %%g in (%~dp0my_tftp_ip.txt) do (
  11.        set myiptftp_loc=%%g
  12.        echo "___exist my_tftp_ip.txt"!myiptftp_loc!
  13.        goto hq_tftp_end
  14.        )  
  15.       
  16.    ) else (
  17.    set myiptftp_loc=10.131.55.65
  18.    echo "no exist my_tftp_ip.txt"%myiptftp_loc%
  19.    )
  20. :hq_tftp_end
  21. mode con cols=100 lines=40
  22. for /f "tokens=1,2,3,4 delims= " %%a in (%~dp00_SW_QB.txt) do (
  23.     set myipdldz_loc=%%b
  24.     set myipyong_loc=%%c
  25.     set myipmima_loc=%%d
  26.     if "%%a"=="华为" (
  27.        echo 2_SCJBHW.bat %%b %%c %%d %myiptftp_loc% %%a
  28.        %~dp02_SCJBHW.bat %%b %%c %%d %myiptftp_loc%
  29.                       ) else (
  30.                                if "%%a"=="思科" (
  31.                                echo 2_SCJBSK.bat %%b %%c %%d %myiptftp_loc% %%a
  32.                                %~dp02_SCJBSK.bat %%b %%c %%d %myiptftp_loc%
  33.                                                  ) else ( echo "发现非思科  非华为")
  34.                               )   
  35.                     )
  36. rem 上面代码(根据交换机品牌生成不同登录VBS脚本)正常执行,但下面添加的代码就不执行了
  37. rem 原本是想依次执行前面生成的vbs文件,但不执行,替换下面简单代码也不执行
  38. echo "结束生成vbs,---------开始调用vbs"
  39. pause
复制代码

当从一个批处理调用另一个批处理时必须用call
call %~dp02_SCJBHW.bat


不然相当于goto到该批处理开头而不能返回
  1. for /f "tokens=1-4 delims= " %%a in (%~dp00_SW_QB.txt) do (
  2. set myipdldz_loc=%%b
  3. set myipyong_loc=%%c
  4. set myipmima_loc=%%d
  5. if "%%a"=="华为" (
  6. echo 2_SCJBHW.bat %%b %%c %%d %myiptftp_loc% %%a
  7. call %~dp02_SCJBHW.bat %%b %%c %%d %myiptftp_loc%
  8. ) else if "%%a"=="思科" (
  9. echo 2_SCJBSK.bat %%b %%c %%d %myiptftp_loc% %%a
  10. call %~dp02_SCJBSK.bat %%b %%c %%d %myiptftp_loc%
  11. ) else (
  12. echo "发现非思科  非华为"
  13. )
  14. )
复制代码

TOP

回复 2# 0000
call命令是知道的,这里主要是询问原代码第2个for循环执行完后,就不继续执行后面的
echo "结束生成vbs,---------开始调用vbs
pause
语句,CMD窗口直接消失。

我需要找到原因,因为希望第二个for循环执行完后,还可执行其它命令。谢谢!

TOP

回复 3# china_abcd


按照2楼的方法加上call命令之后也没有效果是吗?
2_SCJBHW.bat 或 2_SCJBSK.bat 里面是不是有 exit 命令?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# Batcher
谢谢大家的提醒,后来发现原代码中以下语句排版调整后可正常。
      ) else ( echo "发现非思科  非华为")
调整为如下就会执行for循环后的语句了。
      ) else (
        echo "发现非思科  非华为"
      )
由于bat编辑时无调试环境,有时出错在哪也无法查询定位。不知大家会使用何种调试工具或辅助软件。谢谢!

另外还有个问题(准备另建主题),这个bat文件手工执行正常,在win操作系统环境下,通过任务计划调用,因为
有类似     start telnet  
              cscript //nologo %~dp0!myipdldz_loc!.vbs
任务计划调用后会打开新窗口,但会切换输入法到中文,以致命令都成乱码?不知大家有解决方法吗?
我后来尝试找一台无用的虚拟机,删除中文输入法,可以避免这种情况,但还是希望能在普通系统上实现此功能。
谢谢!

TOP

回复 2# 0000
仔细看了你的回复,谢谢!发现你已经代码排版调整了。
) else (
                echo "发现非思科  非华为"
        )
请问bat有编程调试工具吗?

TOP

回复 5# china_abcd


    养成好的编码风格很重要。我使用Nodepad++
http://bbs.bathome.net/thread-3534-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表