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

批处理变量多层嵌套时,call和!怎样一起使用?

  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set ProductName=EditPlus 3
  4. set Namespace=EPP
  5. call set "%Namespace%_CMD_ARG= -i "F:\Users\.config\EditPlus 3""
  6. call set "%Namespace%_CONFIG_FILE=F:\Users\.config\EditPlus 3\EditPlus.ini"
  7. call set "%Namespace%_DATA_PATH=F:\Users\.config\EditPlus 3"
  8. call set "%Namespace%_DIRECTORY=D:\Program Files\EditPlus 3"
  9. call set "%Namespace%_Elevate=0"
  10. call set "%Namespace%_Executable=EditPlus.exe"
  11. call set "%Namespace%_FOLDER=EditPlus 3"
  12. call set "%Namespace%_HOME=D:\Program Files\EditPlus 3"
  13. call set "%Namespace%_REG_KEY=HKCU\Software\ \EditPlus 3"
  14. call set "%Namespace%_RUNTIME=D:\Program Files\EditPlus 3"
  15. for /f "tokens=1* delims==" %%i in ('set %%Namespace%%') do (
  16. set "Variable=%%i"
  17. set "Value=%%j"
  18. rem 这句命令能正确执行替换,但是替换部分不能为%号,就是说命令中的#不能为带百分号的字符。
  19. call call echo set "Value=%%%%Value:%%%Namespace%_DATA_PATH%%=#%%%%"
  20. call echo set "^!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%^!"
  21. rem 疑问: 为什么下面的命令没有做替换
  22. call echo set "!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%!"
  23. )
  24. pause
  25. EndLocal
复制代码

回复 2# xxpinqz


    谢谢回复,其实我也写批处理好多年了,对延迟有一定的了解,这里只是个例子,原来的代码很多,主要目的是用批处理生成批处理。

其实这里可以用别的方法(如:中间字符)实现,就是麻烦一些,放在这里主要是希望有高人给解答一下为什么会有这种行为。

就是在for语句中为什么
  1. call call echo set "Value=%%%%Value:%%%Namespace%_DATA_PATH%%=#%Namespace%_DATA_PATH#%%%%"
复制代码
可以执行替换,而
  1. call echo set "!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%!"
复制代码
不可以,可以用下面命令测试变量在执行替换的时候已经展开了,但是就没有做替换的行为:
  1. call echo set "^!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%^!"
复制代码

TOP

为什么写成这样呢?要干嘛
自己论坛搜索下变量延迟
是不是这意思:
  1. @echo off
  2. set ProductName=EditPlus 3
  3. set Namespace=EPP
  4. set "%Namespace%_CMD_ARG= -i "F:\Users\.config\EditPlus 3""
  5. set "%Namespace%_CONFIG_FILE=F:\Users\.config\EditPlus 3\EditPlus.ini"
  6. set "%Namespace%_DATA_PATH=F:\Users\.config\EditPlus 3"
  7. set "%Namespace%_DIRECTORY=D:\Program Files\EditPlus 3"
  8. set "%Namespace%_Elevate=0"
  9. set "%Namespace%_Executable=EditPlus.exe"
  10. set "%Namespace%_FOLDER=EditPlus 3"
  11. set "%Namespace%_HOME=D:\Program Files\EditPlus 3"
  12. set "%Namespace%_REG_KEY=HKCU\Software\ \EditPlus 3"
  13. set "%Namespace%_RUNTIME=D:\Program Files\EditPlus 3"
  14. setlocal enabledelayedexpansion
  15. for /f "tokens=1* delims==" %%i in ('set %Namespace%') do (
  16.      set "Variable=%%i"
  17.      set "Value=%%j"  
  18.      for /f "delims=" %%a in ("!%Namespace%_DATA_PATH!") do (
  19.          echo set "Value=!Value:%%a=%%!"
  20.      )
  21. )
  22. pause
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

返回列表