【问题标题】:Windows Batch variable containing variables包含变量的 Windows 批处理变量
【发布时间】:2015-02-01 19:16:55
【问题描述】:

我正在编写一个批处理脚本来编辑我的 PATH 变量。我的一些路径由变量组成。像这样:%JAVA_HOME%/bin。在我的批处理脚本中,我执行以下操作:

FOR %%A IN ("%PATH:;=";"%") DO ECHO %%A | FINDSTR /I /C:%stringToFind% >NUL && SET found=true || SET newPath=!newPath!;%%A

所以,%newPath% 变量将包含我想要保留的所有路径。

这很好,除非我使用 SETX 将我的 newPath 保存到 %PATH%。我所有的变量都被扩展了。所以,而不是 %JAVA_HOME%/bin;我得到 C:\PROGRA~1\Java\jdk1.8.0_25\bin;

我的问题是如何将变量作为变量保存在路径中。如何在不扩展变量的情况下获得路径。将它们保留为:%whatever%。我用谷歌搜索无济于事。非常感谢任何帮助。

【问题讨论】:

标签: windows batch-file


【解决方案1】:

我可能弄错了,但我怀疑您的部分问题是%PATH% 存储在注册表中的方式。值的类型是REG_EXPAND_SZ,我猜它会在定义%PATH% 时扩展所有嵌入变量。我怀疑这是因为无论你使用哪种检索方法:

echo %PATH%

setlocal enabledelayedexpansion
echo !PATH!

set PATH

它们都显示 PATH 中已展开的每个变量。

所以,为了解决这个问题,我认为您需要直接从注册表中检索 PATH。

@echo off
setlocal

for /f "tokens=2*" %%I in (
    'reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path'
) do set "HKLMpath=%%J"

for /f "tokens=2*" %%I in (
    'reg query "HKCU\Environment" /v path 2^>NUL'
) do set "HKCUpath=%%J"

setlocal enabledelayedexpansion
echo(!HKLMpath!
if defined HKCUpath echo(!HKCUpath!

然后,只要保持delayedexpansion 样式,就可以不展开组件变量。

无论如何,这只是答案的一半。我不想为了进一步测试而弄乱我的 %PATH%,但如果您对 setx 有问题并保持变量折叠,您可能会找到 this question useful

【讨论】:

    【解决方案2】:

    我确实对%PATH% 进行了实验,@rojo 是正确的——%PATH% 中不能有变量

    您发布的命令摘录中有很多错误,我已修复。 我在下面发帖,你可以看到它们。

    我真的不喜欢单个命令行 FOR 循环,但我就这样离开了,就像你开始那样!

    : Script to remove certain directories from the search path
    ::
    :: We need to use!! variable expansion
    setlocal enabledelayedexpansion
    :: Preset some variables for testing
    set stringToFind=D:
    :: newPath must be initialised to nothing before we start
    set newPath=
    :: Just for testing we could put a variable name in the path
    SET PATH=%%JAVA_THING%%;%PATH%
    :: The following loop fixes bugs with embedded quotes and spaces and too many ;
    FOR %%A IN ("%PATH:;=";"%") DO ECHO;%%A | FINDSTR /I /C:%stringToFind% >NUL && SET found=true || IF !newPath!. == . ( SET newPath=%%~A) ELSE ( SET newPath=!newPath!;%%~A)
    echo;!newPath!
    :: The echo will confirm the %variables% are in the path
    :: setx MYPATH "!newPath!"
    ::  The above setx removes the %variables% from the PATH
    set path2=!newPath:%%=%%%%!
    echo;%path2%
    :: Now We can see the %'s are protected
    setx MYPATH "!path2!"
    :: But when we check the PATH in a new environment we cannot put invalid paths in place
    exit /b
    

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多