代码之家  ›  专栏  ›  技术社区  ›  Synetech

如何使用环境变量作为环境变量名

  •  4
  • Synetech  · 技术社区  · 15 年前

    在寻求另一个与环境变量/批处理文件相关的问题的解决方案时,我再次遇到了我以前访问过的一个问题(但在我的一生中都不记得如何,甚至 如果 我解决了)。

    假设您有两个BAT文件(或一个批处理文件和命令行)。如何将一个环境变量名传递给另一个,以便它可以读取该变量?以下示例不起作用:

    A.BAT:
      @call b.bat path
    
    B.BAT:
      @echo %%1%
    
    > A.BAT
    > %1
    > B.BAT path
    > %1
    

    传递环境变量名很容易,但被调用方似乎无法使用它。(我不记得上次出现这种情况时我是否或如何处理它,但我怀疑它需要重新定向临时BAT文件并调用它们等不太理想的用途。)

    有什么想法吗?谢谢。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Joey Gumbo    15 年前

    你可以使用一些小技巧,但不幸的是,这些技巧没有记录在案:

    call echo %%%1%%
    

    然后可以使用延迟扩展:

    setlocal enabledelayedexpansion
    echo !%1!
    

    延迟扩展在这里有很大帮助,因为它对变量使用了其他分隔符,并在运行命令之前直接对其进行计算,而通常情况下,计算可能与正常的参数扩展冲突。

    另一种过度处理的方法是子例程:

    call :meh "echo %%%1%%"
    
    ...
    
    :meh
    %~1
    goto :eof
    

    所有的例子,包括另一个答案,都有一个共同点:它们都是强制的 cmd 评估变量/参数 两次。 否则它将不起作用,因为第一次评估必须产生 %VariableName% ,而第二个将把它扩展到变量的内容。

    您也可以在上找到代码 my SVN .

        2
  •  2
  •   Joey Gumbo    15 年前

    B.BAT:

    FOR /F "delims=" %%a IN ('echo.%%%1%%') DO set inputvar=%%a
    echo %inputvar%
    

    这是一种方法。

    如果你想做的只是回音,你可以做: echo.%%%1%%|more echo %%%1%%|find /v ""