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

How to expand environment variable inside string read from file?

我有一个包含路径列表的文件。其中一些可能包含环境变量,例如 %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% 但这不起作用,因为变量没有展开。

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

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

所以这应该可以完成工作

call set "include_content=%include_content%"

for循环后

根据 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%