我正在编写一个批处理脚本来编辑我的 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%。我用谷歌搜索没有结果。非常感谢任何帮助。
最佳答案
我可能对此有误,但我怀疑您的问题部分在于 %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%,但你可能会发现 this question useful如果您在 setx
和保持变量折叠方面遇到问题。
关于Windows 批处理变量包含变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266726/