【问题标题】:Echo inside an echo回声中的回声
【发布时间】:2014-05-03 00:53:44
【问题描述】:

我正在尝试获取由其他两个变量组成的变量的值。我让它工作的唯一方法是使用 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

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

约瑟夫

【问题讨论】:

    标签: batch-file buildforge


    【解决方案1】:
    @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!
    

    也许您可能想查看this post

    【讨论】:

    • @sachadee 你们都很棒,但我的问题提出的很糟糕(实际上,Thomas W 指出了它的谬误!)我继续更新它。
    【解决方案2】:
    @echo off
    setlocal enableDelayedExpansion
    set "A=this"
    set "B=that"
    set "thisthat=YES^!"
    
    echo !%A%%B%!
    

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

    【讨论】: