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



我有一个变量的名称保存为字符串(它将从配置文件中读入)。 我想评估这个环境变量,例如将其值打印到控制台。 我不确定该怎么做。

我目前的脚本:

@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作为变量读取,那么我将如何做到这一点?

要获取变量值的值,"通常"的方法是使用延迟扩展.
但您也可以强制第二次解析("扩展扩展变量")。 您可以使用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%%%
@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的值,因为它在我的系统上不存在。

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

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

最新更新