1

我正在尝试获取由其他两个变量组成的变量的值。我让它工作的唯一方法是使用 FOR 命令和 /F 开关并打开第二个命令外壳:

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!

有谁知道更优雅的方式来做到这一点?

更新

这是对我试图完成的事情的更好解释(并且能够使用你们的 - 尤其是 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,因此我需要将此变量设置为与要部署到的主机对应的变量的值。以下是诀窍:

@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

非常感谢大家。希望我的声誉可以让我支持您的答案!

约瑟夫

4

2 回答 2

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%%

但是,您应该注意 !variable! 替换(与 一起)比技巧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!

也许您可能想查看这篇文章

于 2014-05-03T01:45:54.327 回答
2
@echo off
setlocal enableDelayedExpansion
set "A=this"
set "B=that"
set "thisthat=YES^!"

echo !%A%%B%!

请注意,在 thisthat 的赋值中必须对感叹号进行转义,因为启用了延迟扩展。

于 2014-05-03T01:39:28.553 回答