标题: 批处理变量多层嵌套时,call和!怎样一起使用? [打印本页]
作者: qiwei201 时间: 2013-6-20 11:01 标题: 批处理变量多层嵌套时,call和!怎样一起使用?
- @echo off
- SetLocal EnableDelayedExpansion
- set ProductName=EditPlus 3
- set Namespace=EPP
- call set "%Namespace%_CMD_ARG= -i "F:\Users\.config\EditPlus 3""
- call set "%Namespace%_CONFIG_FILE=F:\Users\.config\EditPlus 3\EditPlus.ini"
- call set "%Namespace%_DATA_PATH=F:\Users\.config\EditPlus 3"
- call set "%Namespace%_DIRECTORY=D:\Program Files\EditPlus 3"
- call set "%Namespace%_Elevate=0"
- call set "%Namespace%_Executable=EditPlus.exe"
- call set "%Namespace%_FOLDER=EditPlus 3"
- call set "%Namespace%_HOME=D:\Program Files\EditPlus 3"
- call set "%Namespace%_REG_KEY=HKCU\Software\ \EditPlus 3"
- call set "%Namespace%_RUNTIME=D:\Program Files\EditPlus 3"
-
-
-
- for /f "tokens=1* delims==" %%i in ('set %%Namespace%%') do (
- set "Variable=%%i"
- set "Value=%%j"
- rem 这句命令能正确执行替换,但是替换部分不能为%号,就是说命令中的#不能为带百分号的字符。
- call call echo set "Value=%%%%Value:%%%Namespace%_DATA_PATH%%=#%%%%"
-
- call echo set "^!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%^!"
- rem 疑问: 为什么下面的命令没有做替换
- call echo set "!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%!"
- )
-
- pause
-
- EndLocal
复制代码
作者: xxpinqz 时间: 2013-6-20 14:34
为什么写成这样呢?要干嘛
自己论坛搜索下变量延迟
是不是这意思:- @echo off
- set ProductName=EditPlus 3
- set Namespace=EPP
- set "%Namespace%_CMD_ARG= -i "F:\Users\.config\EditPlus 3""
- set "%Namespace%_CONFIG_FILE=F:\Users\.config\EditPlus 3\EditPlus.ini"
- set "%Namespace%_DATA_PATH=F:\Users\.config\EditPlus 3"
- set "%Namespace%_DIRECTORY=D:\Program Files\EditPlus 3"
- set "%Namespace%_Elevate=0"
- set "%Namespace%_Executable=EditPlus.exe"
- set "%Namespace%_FOLDER=EditPlus 3"
- set "%Namespace%_HOME=D:\Program Files\EditPlus 3"
- set "%Namespace%_REG_KEY=HKCU\Software\ \EditPlus 3"
- set "%Namespace%_RUNTIME=D:\Program Files\EditPlus 3"
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%i in ('set %Namespace%') do (
- set "Variable=%%i"
- set "Value=%%j"
- for /f "delims=" %%a in ("!%Namespace%_DATA_PATH!") do (
- echo set "Value=!Value:%%a=%%!"
- )
- )
- pause
复制代码
作者: qiwei201 时间: 2013-6-20 16:36
回复 2# xxpinqz
谢谢回复,其实我也写批处理好多年了,对延迟有一定的了解,这里只是个例子,原来的代码很多,主要目的是用批处理生成批处理。
其实这里可以用别的方法(如:中间字符)实现,就是麻烦一些,放在这里主要是希望有高人给解答一下为什么会有这种行为。
就是在for语句中为什么- call call echo set "Value=%%%%Value:%%%Namespace%_DATA_PATH%%=#%Namespace%_DATA_PATH#%%%%"
复制代码
可以执行替换,而- call echo set "!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%!"
复制代码
不可以,可以用下面命令测试变量在执行替换的时候已经展开了,但是就没有做替换的行为:- call echo set "^!Value:%%%Namespace%_DATA_PATH%%=%%%%%Namespace%_DATA_PATH%%%%^!"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |