如何在文件中读取字符串中的环境变量?

时间:2015-01-23 17:23:19

标签: batch-file environment-variables

我有一个包含路径列表的文件。其中一些可能包含环境变量,例如%USERPROFILE%

示例:

%USERPROFILE%\dir
C:\another\dir

然后我使用此代码读取所有行并与;连接(由于git,cat和tr命令可用):

set include_file=C:\path\to\file.txt
for /f "delims=" %%i in ('cat %include_file% ^| tr "\\n" ";"') do set include_content=%%i

这会创建一个带有字符串%USERPROFILE%\dir;C:\another\dir的变量 正常运行echo %USERPROFILE%会为您提供类似C:\Users\xxx\dir的内容,但使用%include_content%运行它只会输出原始字符串,而不会展开%USERPATH%

我的最终计划是将目录添加到我的PATH中,例如set PATH=%include_content%;%PATH%,但这不起作用,因为变量没有扩展。

我的问题是,我可以以某种方式扩展字符串中的变量,以便将真实目录添加到路径中吗?

2 个答案:

答案 0 :(得分:3)

您可以使用CALL重新分析一行。

所以这应该做的工作

call set "include_content=%include_content%"

for for循环

答案 1 :(得分:2)

根据jeb的回答,您可能希望阻止将同一目录多次添加到%PATH%。为此,请遍历%PATH%%include_content%中的每个目录。

@echo off
setlocal enabledelayedexpansion

set include_file=test.txt
for /f "delims=" %%i in ('cat %include_file% ^| tr "\n" ";"') do set "include_content=%%i"

call set "include_content=%include_content%"

for %%I in ("%include_content:;=" "%") do if exist "%%~I" (
    set found=
    for %%J in ("%PATH:;=" "%") do (
        if /I "%%~I"=="%%~J" set found=1
    )
    if not defined found set "PATH=!PATH!;%%~I"
)

:: uncomment to make permanent
rem setX PATH %PATH%
echo %PATH%