回答
的系统PATH
变量存储在Windows注册表中与含有对环境变量的引用REG_EXPAND_SZ
类型的值Path
像%SystemRoot%
或者如果不校正由REG_SZ
类型的无环境变量的引用的应用程序下的键
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
改性
用户PATH
变量默认不存在于Windows注册表中,但存储在Windows注册表中,其值为Path
型REG_EXPAND_SZ
或REG_SZ
一旦由应用程序或手动通过下键
HKEY_CURRENT_USER\Environment
外部命令REG与命令QUERY
用户可以用来创建读的系统的值或用户PATH
直接从Windows注册表变量与标准的用户权限。
很可能只是一个单一的命令行来读取Windows注册表中的用户PATH
变量,并将其值与另外扩大目录路径列表中的所有环境变量赋值给一个环境变量UserPath
。
@echo off
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKCU\Environment" /v "Path" 2^>nul') do if /I "%%N" == "Path" call set "UserPath=%%P" & goto UserPathRead
echo There is no user PATH defined.
echo/
pause
goto :EOF
:UserPathRead
echo The user PATH is: %UserPath%
echo/
set "UserPath="
pause
的reg query
输出格式取决于Windows版本,这使得额外的不区分大小写IF条件必要。有关reg query
输出格式的详细信息,请参阅例如Rob van der Woude编写的Reading NT's Registry with REG Query。
的reg query HKCU\Environment /v Path
实施例输出的Windows XP:
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Environment
Path REG_SZ C:\BatUtils
有一个在开头以上的空行,一个在输出端,以及一个标头行和一个多个空行的行上述与注册表项。
包含感兴趣数据的行以4个空格字符开头,接下来是不区分大小写的环境变量Path
的名称。然后将一个单个水平制表符字符输出到注册表值类型REG_SZ
。最后还有一个水平制表符字符之前的字符串值Path
被输出,其中也可能包含一个或多个空格字符。的reg query HKCU\Environment /v Path
实施例输出在Windows 7:
HKEY_CURRENT_USER\Environment
Path REG_SZ C:\BatUtils
还有一个在开始和空行多一个在输出端。但没有标题。第二行包含注册表项。
包含感兴趣数据的行以4个空格字符开头,并且接下来是不区分大小写的环境变量Path
的名称。然后4个空格而不是一个制表符被输出到注册表值类型REG_SZ
。最后还有4个空格而不是一个制表符,在Path
的字符串值被输出之前可能还包含一个或多个空格字符。
命令REG在后台执行一个单独的命令进程FOR。通过REG输出错误消息来处理STDERR在注册表键HKCU\Environment
或值Path
不存在的情况下,通过将其与2>nul
重定向到设备NUL抑制。重定向操作>
必须在这里与插入符号^
逃脱被解释为文字字符的解析FOR由Windows命令解释命令行,但在独立的后台命令过程REG命令行的后续执行重定向操作。
与"skip=2 tokens=1,2*"
结果定义的FOR选项跳过第一2行REG输出和最多分裂其它线路到使用默认定界符空间和片3级的子串(令牌)。
将第一个空格/制表符分隔的字符串分配给第一个循环变量N
,该变量是到达具有感兴趣数据的行的变量的名称。
作为注册表值类型的第二个子字符串被分配给作为ASCII table中下一个字符的循环变量O
。此行为是循环变量区分大小写的原因。
一切后空间/第二子被分配到循环变量P
没有tokens=1,2
后分手了行了,因为*
的选项字符串后剩下的标签。
所以在Windows Vista和更高版本的Windows命令FOR过程从REG与Path
而在Windows XP中处理的第一行的行输出第一行是与作为原因注册表项的行为什么需要条件。
命令GOTO用于退出FOR环上具有成功地读取从Windows注册表中的用户PATH
变量和现有用户PATH
被读取之后,跳转到命令块用于进一步处理。但是,如果用户PATH
变量在Windows注册表中完全不存在,则会到达FOR循环下的命令块。
为了完整一批代码
- 阅读系统和用户
PATH
从Windows注册表, - 串联两个
PATH
变量PATH
与电流的电流指令过程覆盖当地PATH
环境, - 扩大环境变量
PATH
值, - 在
PATH
值替换所有;;
通过;
和 - 从
PATH
值的端除去;
如果有一个。
此批处理代码不检查,如Windows,如果用户PATH
包含串联之前1条或多个目录路径在系统PATH
是已经存在。所以有可能目录路径在本地PATH
最终不止一次出现。
@echo off
rem Get directly from Windows registry the system PATH variable value.
set "SystemPath="
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (
if /I "%%N" == "Path" (
set "SystemPath=%%P"
goto GetUserPath
)
)
rem Get directly from Windows registry the user PATH variable value.
:GetUserPath
set "UserPath="
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKCU\Environment" /v "Path" 2^>nul') do (
if /I "%%N" == "Path" (
set "UserPath=%%P"
goto SetPath
)
)
rem Concatenate the two PATH values to a single value and expand variables.
rem Delete the two environment variables not further needed.
rem Next replace all two consecutive semicolons by a single semicolon.
rem Last remove semicolon from end of directory list if there is one.
:SetPath
call set "PATH=%SystemPath%;%UserPath%"
set "SystemPath="
set "UserPath="
set "PATH=%PATH:;;=;%"
if "%PATH:~-1%" == ";" set "PATH=%PATH:~0,-1%"
对于理解使用的命令以及它们如何工作,打开命令提示符窗口中,执行有下面的命令,并完全读取显示每个命令的所有帮助页面非常谨慎。
call /?
echo /?
for /?
goto /?
if /?
pause /?
reg /?
reg query /?
rem /?
set /?
阅读也是微软文章的2>nul
的解释和一个命令行操作&
意义上的堆栈溢出话题Single line with multiple commands using Windows batch file答案约Using Command Redirection Operators。
- 1. 如何在VBscript中使用变量用户获取路径
- 2. C++:如何获取变量的路径?
- 3. 如何通过系统路径变量从路径获取绝对路径?
- 4. 获取所有路径变量
- 5. 如何在servlet中获取路径变量值
- 6. 如何从Symfony3中的文件变量中获取路径
- 7. 如何获取文件路径从变量名找到
- 8. 如何在的link_to路径获取变量
- 9. 如何从REST URL获取路径变量?
- 10. Spring mvc 3:如何在拦截器中获取路径变量?
- 11. 如何在intercepter中获取路径变量
- 12. 如何从变量Bash中获取路径
- 13. 如何获取JSON路径?
- 14. 如何获取R.java路径?
- 15. 如何使用VBScript中变量路径
- 16. 如何使用路径变量@Preauthorize
- 17. 变量路径
- 18. 变量路径
- 19. 获取用户目录路径
- 20. 如何使用子路径获取资源路径使用NSBundle
- 21. 如何设置环境路径变量忽略当前用户的路径变量
- 22. 如何获取用于Mac OS的Java用户〜/库路径
- 23. 如何使用NSURL获取用户路径
- 24. 如何用javascript_include_tag获取绝对路径?
- 25. 如何获取请求引用路径?
- 26. 如何获取%CD的父路径%如何获取当前%CD%的父路径%
- 27. Ant:如何获取Java路径而不从Main调用路径?
- 28. 获取文件路径,用作按键(applescript)中的变量
- 29. 如何根据路径获取用户控件的类型
- 30. 如何在Drupal中获取用户的个人资料路径?
通过直接从Windows注册表中读取__user__'PATH'。如何使用批处理文件完成此操作可以在批处理代码中看到,例如在从Powershell中调用批处理时缺少环境变量(路径)回答...(http://stackoverflow.com/a/43722410/ 3074564) – Mofi
@Mofi ....必须在没有管理员权限的情况下完成,因此注册编辑不会成为可能 –
不需要管理员权限。您正在修改当前用户的'HKCU \ Environment'键。 – eryksun