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

[系统相关] 为何批处理给变量赋值后,变量值依然是空的?

为了方便日常系统安装工作,写了一个安装用的批处理,全部已经写好了,一运行,发现被闪退了,所以分块测试检查,发现居然存在明明已经赋值的变量是空的。
看看哪位大侠给点指教,下面贴出的代码是发现开始出错的地方。没贴全部,请见谅!
  1. @echo off
  2. for /f "tokens=2 delims=:" %%i in ('chcp') do set ChcpCode=%%i
  3. echo %Chcpcode%
  4. rem chcp 65001 >nul
  5. :Menu
  6. set ReturnMenu=1
  7. cls
  8. color 1E
  9. echo =====================================
  10. echo    ***** 安装软件*****
  11. echo =====================================
  12. echo 1、安装.Net Framework            [1]
  13. echo 2、安装软件1                     [2]
  14. echo 3、安装软件2                     [3]
  15. echo 4、安装软件3                     [4]
  16. echo 5、安装软件4                     [5]
  17. echo 6、安装软件5                     [6]
  18. echo 7、安装软件6                     [7]
  19. echo 8、安装软件7                     [8]
  20. echo 9、安装软件8                     [9]
  21. echo 0、安装软件9                     [0]
  22. echo A、安装软件10                    [A]
  23. echo B、按顺序安装上面软件            [B]
  24. echo C、安装软件11                    [C]
  25. echo Q、退出安装                      [Q]
  26. echo =====================================
  27. echo PS:选择9时,默认安装.Net Framework 4.62
  28. choice /c 1234567890abcq /n
  29. if errorlevel 14 (
  30.   exit
  31. ) else if errorlevel 13 (
  32.   set SS=13
  33. ) else if errorlevel 12 (
  34.   set ReturnMenu=0
  35. ) else if errorlevel 11 (
  36.   set SS=11
  37. ) else if errorlevel 10 (
  38.   set SS=10
  39. ) else if errorlevel 9 (
  40.   set SS=9
  41. ) else if errorlevel 8 (
  42.   set SS=8
  43. ) else if errorlevel 7 (
  44.   set SS=7
  45. ) else if errorlevel 6 (
  46.   set SS=6
  47. ) else if errorlevel 5 (
  48.   set SS=5
  49. ) else if errorlevel 4 (
  50.    set SS=4
  51. ) else if errorlevel 3 (
  52.   set SS=3
  53. ) else if errorlevel 2 (
  54.   set SS=2
  55. ) else (
  56.   set SS=1
  57. )
  58. cls
  59. color 2E
  60. if %SS% == 1 (
  61.   echo =====================================
  62.   echo    ***** 安装.Net Framework*****
  63.   echo =====================================
  64.   echo 1、安装.Net Framework 4.62       [1]
  65.   echo 2、安装.Net Framework 3.5SP1     [2]
  66.   echo 3、安装.Net Framework 2.0        [3]
  67.   echo Q、退出安装                      [Q]
  68.   echo =====================================
  69.   choice /c 123q /n
  70.   if errorlevel 4 (
  71.     goto Menu
  72.   ) else if errorlevel 3 (
  73.     set SS=1.3
  74.   ) else if errorlevel 2 (
  75.     set SS=1.2
  76.   )
  77. rem 下面这个aa变量赋值成功!
  78.   set aa=1.3
  79.   echo [%aa%]
  80. ) else if %SS% LSS 13 (
  81.   echo =====================================
  82.   echo    ***** 安装软件 *****
  83.   echo =====================================
  84.   echo 1、安装软件1                     [1]
  85.   echo 2、安装软件2                     [2]
  86.   echo 3、安装软件3                     [3]
  87.   echo Q、退出安装                      [Q]
  88.   echo =====================================
  89.   choice /c 123q /n
  90.   if errorlevel 4 (
  91.     goto Menu
  92.   ) else if errorlevel 3 (
  93.     set SS=1.3
  94.   ) else if errorlevel 2 (
  95.     set SS=1.2
  96.   )
  97. rem 为什么下面这个aa变量赋值不成功?
  98.   set aa=1.4
  99.   echo [%aa%]
  100. )
  101. pause
复制代码

这是批处理的预处理机制导致的。
修改方法:在第六行添加
  1. setlocal enabledelayedexpansion
复制代码
第103行改为
  1. echo [!aa!]
复制代码

TOP

回复 2# 路过


    十分感激,测试成功!但有个问题想了解一下,为何第一个IF那里无需按你的方法处理都能成功呢?

TOP

回复 3# microyip 你确定?在你给的出错的代码里第一个界面按1,变量SS=1
然后第二个界面也按1,执行第83行代码后的结果是"[]",也就是变量aa"消失了"。

可能的原因是在执行64-104行代码之前变量aa的值已经是1.3了。

TOP

回复 4# 路过 多谢多谢耐心指导,有点懵逼,之前测试时候是可以的,你一说,发现还真的不可以。

TOP

回复 1# microyip


推荐阅读:批处理中的变量延迟扩展、变量嵌套
http://bbs.bathome.net/thread-2899-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

回复 6# Batcher 感谢推荐,多问个问题,那么加了setlocal enabledelayedexpansion之后,是否要把所有双%变量改成双!变量?

TOP

回复 7# microyip


    如果6楼的教程看完之后仍然有疑问,欢迎随时联系我。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表