Board logo

标题: 批处理变量多层嵌套时,call和!怎样一起使用? [打印本页]

作者: qiwei201    时间: 2013-6-20 11:01     标题: 批处理变量多层嵌套时,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
复制代码

作者: xxpinqz    时间: 2013-6-20 14:34

为什么写成这样呢?要干嘛
自己论坛搜索下变量延迟
是不是这意思:
  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
复制代码

作者: qiwei201    时间: 2013-6-20 16:36

回复 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%%%%^!"
复制代码





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