2017-05-12 48 views
1

Echo %PATH%返回系统 PATH变量+ 用户 PATH变量。如何获取用户路径变量?

如何获得只有用户 PATH变量?

+1

通过直接从Windows注册表中读取__user__'PATH'。如何使用批处理文件完成此操作可以在批处理代码中看到,例如在从Powershell中调用批处理时缺少环境变量(路径)回答...(http://stackoverflow.com/a/43722410/ 3074564) – Mofi

+0

@Mofi ....必须在没有管理员权限的情况下完成,因此注册编辑不会成为可能 –

+0

不需要管理员权限。您正在修改当前用户的'HKCU \ Environment'键。 – eryksun

回答

0

系统PATH变量存储在Windows注册表中与含有对环境变量的引用REG_EXPAND_SZ类型的值Path%SystemRoot%或者如果不校正由REG_SZ类型的无环境变量的引用的应用程序下的键

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 
改性

用户PATH变量默认不存在于Windows注册表中,但存储在Windows注册表中,其值为PathREG_EXPAND_SZREG_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过程从REGPath而在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