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

时间:2020-11-04 22:45:38

标签: batch-file environment-variables

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

我当前的脚本:

@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作为变量,那么我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

@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的情况下正确地使用./script foo bar 的任何现有值。

答案 1 :(得分:1)

要获取变量值的值,“常规”方法是使用delayed expansion
但是,您也可以强制进行第二次解析(“扩展扩展变量”)。 您可以使用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%%%