1

他の 2 つの変数で構成される変数の値を取得しようとしています。これを機能させる唯一の方法は、FOR コマンドに /F スイッチを付けて使用し、2 つ目のコマンド シェルを開くことです。

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'allの、特に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

どうもありがとうございました。あなたの答えに賛成票を投じることができる評判があればいいのに!

ヨゼフ

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

ただし、!変数! 置換 (と一緒に)は、トリックよりもはるかに高速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 に答える