Windows 包含变量的批处理变量

Windows Batch variable containing variables

我正在编写一个批处理脚本来编辑我的 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 将我的新路径保存到 %PATH%。我所有的变量都被扩展了。所以,而不是 %JAVA_HOME%/bin;我得到 C:\PROGRA~1\Java\jdk1.8.0_25\bin;

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

我可能对此有误,但我怀疑您的部分问题是 %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

我用 %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