Board logo

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

作者: china_abcd    时间: 2018-8-19 06:29     标题: 批处理脚本中有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
复制代码

作者: 0000    时间: 2018-8-19 08:59

当从一个批处理调用另一个批处理时必须用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. )
复制代码

作者: china_abcd    时间: 2018-8-20 08:07

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

我需要找到原因,因为希望第二个for循环执行完后,还可执行其它命令。谢谢!
作者: Batcher    时间: 2018-8-20 09:37

回复 3# china_abcd


按照2楼的方法加上call命令之后也没有效果是吗?
2_SCJBHW.bat 或 2_SCJBSK.bat 里面是不是有 exit 命令?
作者: china_abcd    时间: 2018-8-25 05:09

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

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

回复 2# 0000
仔细看了你的回复,谢谢!发现你已经代码排版调整了。
) else (
                echo "发现非思科  非华为"
        )
请问bat有编程调试工具吗?
作者: Batcher    时间: 2018-8-25 11:52

回复 5# china_abcd


    养成好的编码风格很重要。我使用Nodepad++
http://bbs.bathome.net/thread-3534-1-1.html




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