如何在从文件读取的字符串中扩展环境变量?
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%
我有一个包含路径列表的文件。其中一些可能包含环境变量,例如 %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%