包含变量的Windows Batch变量

时间:2015-02-01 19:16:55

标签: 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;

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我做了%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