【问题标题】:How to expand environment variable inside string read from file?如何在从文件读取的字符串中扩展环境变量?
【发布时间】:2015-01-23 17:23:18
【问题描述】:

我有一个包含路径列表的文件。其中一些可能包含环境变量,例如%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%

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

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

【问题讨论】:

    标签: batch-file environment-variables


    【解决方案1】:

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

    所以这应该可以完成工作

    call set "include_content=%include_content%"
    

    for循环之后

    【讨论】:

      【解决方案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%
      

      【讨论】:

      • 对于避免路径变量问题非常有用
      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2021-06-04
      • 2019-07-05
      相关资源
      最近更新 更多