【问题标题】:windows batch command nested variablewindows批处理命令嵌套变量
【发布时间】:2018-02-14 11:26:12
【问题描述】:

我需要使用嵌套变量来根据环境变量创建文件夹。

假设我有下面列出的变量:

%ABC_ASIA_LOCATION% 
%ABC_EUROPE_LOCATION%
%ABC_US_LOCATION%

我想将国家作为变量传递给%ABC_%COUNTRY%_LOCATION%

如何在 Windows 中使用批处理脚本来实现这一点?

【问题讨论】:

  • 此链接后面的信息与嵌套没有直接关系,但如果在进一步的阶段需要,可能有助于变量值替换Variable Edit/Replace

标签: windows batch-file cmd nested environment-variables


【解决方案1】:

您必须将 每个 变量包含在 % 中:

set "ABC=ABC"
set "COUNTRY=EUROPE
set "LOCATION=MUNICH
echo %ABC%_%COUNTRY%_%LOCATION%

结果:ABC_EUROPE_MUNICH

或者,如果您只想将 Country 作为变量,则保持其余部分不变:

echo ABC_%COUNTRY%_LOCATION

结果:ABC_EUROPE_LOCATION

或者如果你想让整个东西成为一个变量(一个包含另一个变量的变量名),你必须使用delayed expansion

setlocal enabledelayedexpansion
set country=EUROPE
set "ABC_EUROPE_LOCATION=a town in southern Germany"
echo !ABC_%country%_LOCATION!

给你:a town in southern Germany

注意:setlocal 在批处理文件之外无效,因此延迟扩展仅适用:
- 在批处理文件中
- 当命令提示符在启用延迟扩展的情况下启动时 (cmd /v:on)(默认情况下,命令提示符运行延迟扩展disabled)

【讨论】:

  • 或许你应该强调setlocalonly在批处理文件中起作用,并且要直接在命令行上使用延迟扩展,需要先发出cmd /v
  • @JosephQuinsey:是的,可能对初学者有帮助。 (这样的东西深深烙在我的脑海里,很难记住,别人可能不知道......)我添加了一个注释。
【解决方案2】:

有时您需要嵌套变量在 for 循环中工作,而这已经需要 !varname!变量扩展的语法。在这种情况下,!ABC_%country%LOCATION! 将不起作用(参考 Stephan 在 2017 年 9 月 6 日 7:24 的帖子)。 !ABC!country!_LOCATION! 也不会。

以下批处理文件演示了这一点。这是一个有点人为的例子来证明这个问题。在子程序中,如果您不想在子程序中进行工作,我们也可以将变量设置为嵌套值。

@echo off
setlocal enabledelayedexpansion
setlocal

set var1=value1
set var2=value2
set var3=value3
set var4=value4
set var5=value5

for %%A in (var1 var2 var3 var4 var5) do (
    set varname=%%A
    echo 1.This will not work: !varname!=!!varname!!
    echo 2.This will not work: !varname!=%!varname!%
    echo 3.This will not work: !varname!=!%varname%!
    echo 4.This will not work: %varname%=%varname%
    echo 5.This will not work: %varname%=%%varname%%
    call:NestedVar %%A
    
    call:getNestedVar new%%A %%A
    echo new%%A=!new%%A!

    echo.
    echo.

)

goto:eof
:NestedVar
    echo       This will work: %1=!%1!     (but only if setlocal enabledelayedexpansion is used)
    goto:eof

:getNestedVar
    REM Use: getNestedVar newVariableName varName
    REM Will set newVariableName to the value of varName
    echo Setting variable, %1=!%2!
    set %1=!%2!
    goto:eof

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多