Batch file .bat批处理文件如何从字符串中获取环境变量?

Batch file .bat批处理文件如何从字符串中获取环境变量?,batch-file,environment-variables,Batch File,Environment Variables,我将变量的名称保存为字符串(它将从配置文件中读取)。我想计算这个环境变量,例如将其值打印到控制台。我不知道该怎么做 我当前的脚本: @echo off set env_var=VIVADO_BAT_PATH_2018_3 set str=set vivado_bat_path=%env_var% %str% echo "bat path: %vivado_bat_path%" set str=set vivado_bat_path=%%env_var%% %str%

我将变量的名称保存为字符串(它将从配置文件中读取)。我想计算这个环境变量,例如将其值打印到控制台。我不知道该怎么做

我当前的脚本:

@echo off

set env_var=VIVADO_BAT_PATH_2018_3

set str=set vivado_bat_path=%env_var%
%str%
echo "bat path:  %vivado_bat_path%"

set str=set vivado_bat_path=%%env_var%%
%str%
echo "bat path:  %vivado_bat_path%"
其电流输出:

"bat path:  VIVADO_BAT_PATH_2018_3"
"bat path:  %env_var%"
期望输出:

"bat path:  C:/Xilinx/Vivado/2018.3/bin/vivado.bat" (or whatever value the env var is set to)
我知道我可以通过
echo%VIVADO_BAT_PATH_2018_3%
获得所需的输出,但我正在将
VIVADO_BAT_PATH_2018_3
作为一个变量来阅读,那么我该如何做呢

@ECHO OFF
SETLOCAL
set "VIVADO_BAT_PATH_2018_3=I Want This String"
set env_var=VIVADO_BAT_PATH_2018_3

set str=set vivado_bat_path=%env_var%
%str%
echo "bat path:  %vivado_bat_path%"

set str=set vivado_bat_path=%%env_var%%
%str%
echo "bat path:  %vivado_bat_path%"

set "bingo=Not Found"
for /f "tokens=1*delims==" %%a in ('set %env_var% 2^>nul') do if /i "%%a"=="%env_var%" set "bingo=%%b"
echo I found "%bingo%"

GOTO :EOF
除了代码之外,这应该扩展变量

我强制设置了
VIVADO_BAT_PATH_2018_3
的值,因为我的系统中不存在该值

例如,
如果/i
确保名为
VIVADO_BAT_PATH_2018_3_old
的环境变量存在,则仅报告名为
VIVADO_BAT_PATH_2018_3
的变量

如果
VIVADO_BAT_PATH_2018_3
不存在,则
2^>nul
会抑制错误消息。
^
转义
,告诉批处理
>
set
命令的一部分,而不是
for
命令的一部分
bingo
设置在的
之前,以确保在批处理运行时,不会将
bingo
的任何现有值误认为所需值

除了代码之外,这应该扩展变量

我强制设置了
VIVADO_BAT_PATH_2018_3
的值,因为我的系统中不存在该值

例如,
如果/i
确保名为
VIVADO_BAT_PATH_2018_3_old
的环境变量存在,则仅报告名为
VIVADO_BAT_PATH_2018_3
的变量


如果
VIVADO_BAT_PATH_2018_3
不存在,则
2^>nul
会抑制错误消息。
^
转义
,告诉批处理
>
set
命令的一部分,而不是
for
命令的一部分
bingo
设置在
之前,以确保
bingo
的任何现有值不会被误认为在批处理运行时已设置了
bingo
所需值。

要获取变量值,使用“常用”方法。
但您也可以强制进行第二次解析(“展开展开变量”)。 您可以使用
call
命令(它在第二个单独的进程中执行以下命令)来实现这一点。要将文本
%
传递给第二个进程,请使用另一个
%
对其进行转义,这解释了奇怪的三元组
%

@echo off
setlocal enabledelayedexpansion

set "string=varname"
set "varname=some text"

echo with delayed expansion:    %string% = !%string%!
call echo without delayed expansion: %string% = %%%string%%%

要获取变量值的值,“常用”方法是使用。
但您也可以强制进行第二次解析(“展开展开变量”)。 您可以使用
call
命令(它在第二个单独的进程中执行以下命令)来实现这一点。要将文本
%
传递给第二个进程,请使用另一个
%
对其进行转义,这解释了奇怪的三元组
%

@echo off
setlocal enabledelayedexpansion

set "string=varname"
set "varname=some text"

echo with delayed expansion:    %string% = !%string%!
call echo without delayed expansion: %string% = %%%string%%%

如果您想在此时执行bat文件的路径,您可以使用
%~f0
调用echo%%%env_var%%
?如果您想在此时执行bat文件的路径,您可以使用
%~f0
调用echo%%%env_var%%