Board logo

标题: [其他] 批处理如何清除自定义的变量? [打印本页]

作者: binghejin    时间: 2016-5-27 13:05     标题: 批处理如何清除自定义的变量?

举例说明问题,例如:
  1. @echo off
  2. :1
  3. cls
  4. set /p a=请输入要删除的文件名,输入0退出。
  5. if "%a%"=="" goto 1
  6. if "%a%"=="0" goto end
  7. if not exist %a% goto 错误
  8. del %a% >nul
  9. goto 1
  10. :错误
  11. echo 没有%a%这个文件,请检查.
  12. pause
  13. goto 1
  14. :end
复制代码
就是类似这样的批处理,在运行过程中发现,比如第一次输入1,批处理确实将1这个文件删除了,但是如果多输入几次,例如把1,2,3,4,5,6这6个文件都删除之后要退出的时候,输入0,批处理并不退出,而是继续执行删除0这个文件,而0这个文件根本不存在,于是批处理报错,请问该怎么处理?
在网上找到的答案无外乎两种:
1、用@echo off&setlocal enabledelayedexpansion这个代码,但无效。
2、用set a=<nul这个代码来清空变量,但是依然无效!
作者: gawk    时间: 2016-5-27 13:41

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :1
  4. cls
  5. set /p a=请输入要删除的文件名,输入0退出。
  6. if "!a!"=="" goto 1
  7. if "!a!"=="0" goto end
  8. if not exist !a! goto 错误
  9. del !a! >nul
  10. goto 1
  11. :错误
  12. echo 没有!a!这个文件,请检查.
  13. pause
  14. goto 1
  15. :end
复制代码
开启变量延迟扩展之后需要把%a%改成!a!
作者: 111    时间: 2016-5-27 23:39

一般我就“set a=”了
作者: heyoug    时间: 2016-5-28 10:23

if "!a!"=="0"   这里我习惯用 if !a! equ 0 判断,
:1的下一行我会加一个 set a=0
作者: binghejin    时间: 2016-5-28 13:41

本帖最后由 pcl_test 于 2016-5-29 12:56 编辑

回复 2# gawk
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%1%"=="f" goto 1
  3. goto 权限错误
  4. :1
  5. title 删除积分记录
  6. cls
  7. echo=
  8. echo=
  9. echo 快保维修会员管理系统V1.00 删除积分记录
  10. echo =======================================
  11. dir /b shuju
  12. echo =======================================
  13. echo 请输入车号,输入0返回!
  14. set /p u=
  15. if "%u%"=="" goto 1
  16. if "%u%"=="0" goto end
  17. if not exist shuju\%u% goto 车号不存在
  18. :2
  19. cls
  20. if exist temp\ls.txt del temp\ls.txt>nul
  21. if exist temp\list.txt del temp\list.txt>nul
  22. set k=%time: =0%
  23. set l=%k::=%
  24. set m=%l:~0,6%
  25. set n=%date:~2,2%
  26. if not exist shuju\%u%\%n%* goto 3
  27. dir shuju\%u%\%n%* /b >temp\ls.txt
  28. findstr /n .* temp\ls.txt>>temp\list.txt
  29. echo=
  30. type temp\list.txt
  31. :3
  32. set z=0
  33. echo ===============================================================
  34. for /f %%b in (shuju\%u%\zf) do (echo 车号 %u% 的车辆,目前积分 %%b 分!)
  35. echo ===============================================================
  36. echo 请输入要删除的积分记录,输入 X 删除 %u% 所有积分记录
  37. echo 0=返回
  38. set /p z=请输入要删除的序号
  39. if "%z%"=="" goto 2
  40. if "%z%"=="0" goto end
  41. if "%z%"=="x" goto 删除全部
  42. set d=temp\ls.txt
  43. for %%e in (%z%) do (call :lp %%e)
  44. :lp
  45. for /f "tokens=1,* delims=:" %%f in ('findstr/n .* %d%') do (
  46. if %%f equ %1 echo.%%g>>temp\new.txt)
  47. for /f %%e in (temp\new.txt) do (
  48. del shuju\%u%\%%e >nul 2>nul
  49. )
  50. for /f %%x in (shuju\%u%\zf) do (set jsj=%%x)
  51. echo A= %jsj% >>temp\js.vbs
  52. echo B= %sz% >>temp\js.vbs
  53. echo jieguo =eval(0+ A - B)>>temp\js.vbs
  54. echo createobject("scripting.filesystemobject").createtextfile("temp\sz.txt",true).write jieguo>>temp\js.vbs
  55. call temp\js.vbs
  56. for /f %%q in (temp\sz.txt) do (set xsj=%%q)
  57. del shuju\%u%\zf >nul 2>nul
  58. echo %xsj% >shuju\%u%\zf
  59. goto 2
  60. :删除全部
  61. echo=
  62. echo 您确定删除 %u% 的全部积分记录吗?【1=确定 0=返回】
  63. set /p o=
  64. if "%o%"=="" goto 删除全部
  65. if "%o%"=="1" goto 确定删除全部
  66. if "%o%"=="0" goto 1
  67. goto 1
  68. :确定删除全部
  69. del /q shuju\%u%\*.*
  70. rd shuju\%u%
  71. if not exist shuju\%u% goto 1
  72. goto 删除全部错误
  73. :车号不存在
  74. echo=
  75. echo 您输入的车辆 %u% 不存在...
  76. pause
  77. goto 1
  78. :删除全部错误
  79. echo=
  80. echo 删除 %u% 全部积分记录失败,请稍后再试...
  81. pause
  82. goto 1
  83. :权限错误
  84. cls
  85. echo=
  86. echo 该功能模块为系统调用...
  87. pause
  88. :end
复制代码
代码如上,出现错误的地方集中在第37行那里,例如:当该批处理文件执行5次之后,输入0,程序并不结束,而是继续执行,当连续输入5次0之后,程序才结束,也就是说,该批处理执行几次,那么退出的时候也需要执行几次,才能退出!
把%号改成!号没用。
作者: kaze    时间: 2019-6-17 17:15

本帖最后由 kaze 于 2019-6-17 17:25 编辑

请问解决了没有?




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