找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31549|回复: 6

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

[复制链接]
发表于 2018-8-19 06:29:00 | 显示全部楼层 |阅读模式
  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
复制代码
发表于 2018-8-19 08:59:20 | 显示全部楼层
当从一个批处理调用另一个批处理时必须用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. )
复制代码
 楼主| 发表于 2018-8-20 08:07:59 | 显示全部楼层
回复 2# 0000
call命令是知道的,这里主要是询问原代码第2个for循环执行完后,就不继续执行后面的
echo "结束生成vbs,---------开始调用vbs
pause
语句,CMD窗口直接消失。

我需要找到原因,因为希望第二个for循环执行完后,还可执行其它命令。谢谢!
发表于 2018-8-20 09:37:39 | 显示全部楼层
回复 3# china_abcd


按照2楼的方法加上call命令之后也没有效果是吗?
2_SCJBHW.bat 或 2_SCJBSK.bat 里面是不是有 exit 命令?
 楼主| 发表于 2018-8-25 05:09:37 | 显示全部楼层
回复 4# Batcher
谢谢大家的提醒,后来发现原代码中以下语句排版调整后可正常。
      ) else ( echo "发现非思科  非华为")
调整为如下就会执行for循环后的语句了。
      ) else (
        echo "发现非思科  非华为"
      )
由于bat编辑时无调试环境,有时出错在哪也无法查询定位。不知大家会使用何种调试工具或辅助软件。谢谢!

另外还有个问题(准备另建主题),这个bat文件手工执行正常,在win操作系统环境下,通过任务计划调用,因为
有类似     start telnet  
              cscript //nologo %~dp0!myipdldz_loc!.vbs
任务计划调用后会打开新窗口,但会切换输入法到中文,以致命令都成乱码?不知大家有解决方法吗?
我后来尝试找一台无用的虚拟机,删除中文输入法,可以避免这种情况,但还是希望能在普通系统上实现此功能。
谢谢!
 楼主| 发表于 2018-8-25 05:15:50 | 显示全部楼层
回复 2# 0000
仔细看了你的回复,谢谢!发现你已经代码排版调整了。
) else (
                echo "发现非思科  非华为"
        )
请问bat有编程调试工具吗?
发表于 2018-8-25 11:52:39 | 显示全部楼层
回复 5# china_abcd


    养成好的编码风格很重要。我使用Nodepad++
http://bbs.bathome.net/thread-3534-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 17:42 , Processed in 0.017899 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表