我试图找到由另外两个变量组成的变量的值。我使用它的唯一方法是使用FOR命令和/ F开关并打开第二个命令shell:
SET A=This
SET B=That
SET ThisThat=YES!
FOR /F %I IN ('ECHO %A%%B%') DO cmd.exe /C ECHO %%I%
输出:
C:\>cmd.exe /c echo %ThisThat%
YES!
有没有人知道更优雅的方法呢?
更新
这里有一个更好的解释我想要完成的事情(并且能够完成使用y'所有 - 尤其是Aacini的答案)
对于Rational BuildForge项目,我为每个部署目标主机定义了环境变量。例如:
CURAM_HOST_NAME_DEV=DDW5T
CURAM_HOST_NAME_UAT=DUW5T
CURAM_HOST_NAME_TRN=DTW5T
CURAM_HOST_NAME_PRD=DPW5P
另一个变量HOST包含要部署的环境。部署代码对于所有部署目标都是通用的,并使用变量CURAM_HOST_NAME,因此我需要将此变量设置为与要部署的HOST对应的变量的值。以下是诀窍:
@ECHO OFF
SET CURAM_HOST_NAME_DEV=DDW5T
SET CURAM_HOST_NAME_UAT=DUW5T
SET CURAM_HOST_NAME_TRN=DTW5T
SET CURAM_HOST_NAME_PRD=DPW5P
SET HOST=DEV
CALL ECHO %%CURAM_HOST_NAME_%HOST%%%
SET HOST=UAT
CALL ECHO %%CURAM_HOST_NAME_%HOST%%%
SET HOST=TRN
CALL ECHO %%CURAM_HOST_NAME_%HOST%%%
SET HOST=PRD
CALL ECHO %%CURAM_HOST_NAME_%HOST%%%
输出:
DDW5T
DUW5T
DTW5T
DPW5P
在BuildForge步骤中,设置此特定变量的代码如下所示:
.bset env "CURAM_HOST_NAME=`CALL ECHO %%%CURAM_HOST_NAME_%%HOST%%%%`"
(BF解析器需要额外的%')
对于HOST变量的DEV值,这会在日志中生成以下内容:
1026 5/3/14 7:34 PM STEP .bset env "CURAM_HOST_NAME=`CALL ECHO %%%CURAM_HOST_NAME_%%HOST%%%%`"
1027 5/3/14 7:34 PM EXEC .bset env 'CURAM_HOST_NAME' = 'DDW5BTH
非常感谢大家。希望我的声誉可以让我提出你的答案!
Jozef
答案 0 :(得分:3)
@echo off
SET A=This
SET B=That
SET ThisThat=YES!
call echo %%%A%%B%%%
编辑:更新了更新问题的答案!
@ECHO OFF
SET CURAM_HOST_NAME_DEV=DDW5T
SET CURAM_HOST_NAME_UAT=DUW5T
SET CURAM_HOST_NAME_TRN=DTW5T
SET CURAM_HOST_NAME_PRD=DPW5P
for %%a in (DEV UAT TRN PRD) do CALL ECHO %%CURAM_HOST_NAME_%%a%%
但是,你应该注意!变量!替换(与setlocal EnableDelayedExpansion
一起)运行比CALL echo %%variable%%
技巧更快:
@ECHO OFF
setlocal EnableDelayedExpansion
SET CURAM_HOST_NAME_DEV=DDW5T
SET CURAM_HOST_NAME_UAT=DUW5T
SET CURAM_HOST_NAME_TRN=DTW5T
SET CURAM_HOST_NAME_PRD=DPW5P
for %%a in (DEV UAT TRN PRD) do ECHO !CURAM_HOST_NAME_%%a!
也许您可能想要查看this post
答案 1 :(得分:2)
@echo off
setlocal enableDelayedExpansion
set "A=this"
set "B=that"
set "thisthat=YES^!"
echo !%A%%B%!
请注意,必须在分配时转义感叹号,因为已启用延迟扩展。