Windows 批处理变量包含变量

标签 windows batch-file

我正在编写一个批处理脚本来编辑我的 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/

相关文章:

java - 在 Eclipse Mars 中通过命令行创建一个 war 文件

windows - 使用批处理文件打开多个 PDF 文档

batch-file - 向批处理脚本添加标志

batch-file - 如何使用参数调用 Run()

windows - 网络蓝牙 - Windows 11 断开连接

.net - Windbg 可以显示线程名称吗?

windows - 检查特定过程在delphi中是否升高

Windows(可选 Cygwin): Removing file which is locked by another process, 来自命令行

java - 如何阻止cmd.bat关闭——java jar应用程序

windows - 从任务计划程序调用时,Powershell 输出无法正确记录