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