如何只获取用户路径变量?

2024-03-30

Echo %PATH%回报system路径变量+user路径变量。

如何只得到user路径变量?


The system PATH变量的值存储在 Windows 注册表中Path类型的REG_EXPAND_SZ包含对环境变量的引用,例如%SystemRoot%或者如果不正确,则由类型的应用程序修改REG_SZ注册表项下没有环境变量引用:

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

The user PATH默认情况下,Windows 注册表中不存在变量。它存储在 Windows 注册表中,其值是Path类型的REG_EXPAND_SZ or REG_SZ一旦由应用程序创建或由用户在注册表项下手动创建:

HKEY_CURRENT_USER\Environment

外部命令REG用命令QUERY可以用来read的价值system or the user PATH变量直接来自 Windows 注册表,具有标准用户权限。

可以阅读user PATH来自 Windows 注册表的变量并将其值分配给环境变量UserPath另外扩展目录路径列表中的所有环境变量。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "UserPath="
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKCU\Environment" /v "Path" 2^>nul') do if /I "%%G" == "Path" (
    if /I "%%H" == "REG_EXPAND_SZ" (call set "UserPath=%%I") else if /I "%%H" == "REG_SZ" set "UserPath=%%I"
    if defined UserPath goto UserPathRead
)
echo User PATH is not defined or has no string value.
goto EndBatch

:UserPathRead
setlocal EnableDelayedExpansion
echo The user PATH is: !UserPath!
endlocal

:EndBatch
echo/
pause
endlocal

输出格式为reg query取决于 Windows 版本,这使得附加不区分大小写IF必要的条件。有关详细信息reg query输出格式参见示例使用 REG 查询读取 NT 的注册表 https://www.robvanderwoude.com/ntregquery.php由罗布·范德沃德撰写。

示例输出reg query HKCU\Environment /v Path 在 Windows XP 上:


! REG.EXE VERSION 3.0

HKEY_CURRENT_USER\Environment
    Path        REG_SZ  C:\BatUtils

输出的开头有一个空行,末尾有一个空行,还有一个标题行,在包含注册表项的行上方还有一个空行。

包含感兴趣数据的行以四个空格字符开头,接下来是注册表值的不区分大小写的名称Path。然后一个单个水平制表符字符被输出到注册表值类型REG_SZ。最后还有一个水平制表符字符串值之前的字符Path是可能包含一个或多个空格字符的输出。

示例输出reg query HKCU\Environment /v Path 在 Windows Vista 上或更新的 Windows 版本:


HKEY_CURRENT_USER\Environment
    Path    REG_SZ    C:\BatUtils

输出的开头还有一个空行,末尾还有一个空行。但没有标题。第二行已包含注册表项。

包含感兴趣数据的行以四个空格字符开头,接下来是注册表值的不区分大小写的名称Path. Then 四个空格而不是选项卡的输出留给注册表值类型REG_SZ。最后还有四个空格而不是字符串值之前的制表符Path是还可以包含一个或多个空格字符的输出。

命令REG在后台的单独命令进程中执行FOR。输出的错误信息为REG处理STDERR如果是注册表项HKCU\Environment或值Path通过将不存在的内容重定向到设备来抑制NUL with 2>nul。重定向运算符>必须在此处使用脱字符号进行转义^在解析时被解释为文字字符FOR由 Windows 命令解释器执行的命令行,但在以后执行时作为重定向操作符REG单独后台命令进程中的命令行。

The FOR选项定义为"skip=2 tokens=1,2*"导致跳过前两行REG输出并使用默认分隔符空格和制表符将其他行分成三个子字符串(标记)。

第一个空格/制表符分隔的字符串被分配给第一个循环变量G这是到达感兴趣数据行时变量的名称。

第二个子字符串是注册表值类型,分配给循环变量H成为下一个角色ASCII 表 https://www.asciitable.com/。这种行为的原因是FOR循环变量区分大小写。

第二个子字符串之后的空格/制表符之后的所有内容都分配给循环变量I不分割线的其余部分,因为*在选项字符串之后tokens=1,2.

因此,在 Windows Vista 和更高版本的 Windows 上,该命令FOR处理作为输出的第一行REG线与Path而在 Windows XP 上,处理的第一行是包含注册表项的行,这就是第一行的原因IF条件是必要的。

第二IF条件进行不区分大小写的字符串比较,以找出具有名称的注册表值的类型Path。分配给的字符串Path包含类型REG_EXPAND_SZ一个或多个环境变量引用。由于这个原因,命令call用于解析从注册表读取的字符串值并将其分配给循环变量I由 Windows 命令处理器在命令之前展开所有环境变量引用SET执行以将扩展的字符串值分配给环境变量UserPath.

Note: cmd.exe搜索具有名称的可执行文件或脚本set使用本地环境变量PATHEXT and PATH因为使用命令CALL。命令CALL设计用于从批处理文件中调用批处理文件,而不是强制 Windows 命令处理器再次解析命令行。

第三IF仅当注册表值达到时才执行条件Path不属于类型REG_EXPAND_SZ。它将不区分大小写的注册表值类型与字符串进行比较REG_SZ在这种情况下,字符串值Path可以直接赋值给环境变量UserPath.

环境变量UserPath上面明确未定义FOR环形。所以如果当前行有第一个字符串Path无论如何,注册表值类型是REG_EXPAND_SZ or REG_SZ,现在应该定义环境变量UserPath否则有一个注册表值Path类型错误或空字符串。有可能有Path以空字符串存储在 Windows 注册表中,但无法定义环境变量UserPath带有一个空字符串。

第四个IF条件验证环境变量UserPath实际上是用非空字符串定义的。在这种情况下命令GOTO用于退出FOR成功读取后循环user PATH通过跳转到命令块来进一步处理环境变量,从 Windows 注册表中获取变量UserPath.

下面的命令块FOR如果达到循环user PATHWindows 注册表中根本不存在变量,或者类型错误,或者存在空字符串。

为了完整起见,批处理代码

  • read system AND user PATH来自Windows注册表而不扩展,
  • 连接两者PATH变量到PATH与覆盖local PATH在当前环境下的当前命令进程中,
  • 如果有必要,现在展开所有环境变量引用。
  • 全部替换;; by ; in PATH值和
  • remove ;从年底开始PATH值(如果有的话)。

该批处理代码不检查是否user PATH包含一个或多个已存在的目录路径system PATH在连接它们之前。所以目录路径可能位于local PATH终于出现不止一次了。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Get directly from Windows registry the system PATH variable value.
set "PathExpand="
set "PathSystem="
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do if /I "%%G" == "Path" (
    if /I "%%H" == "REG_EXPAND_SZ" (set "PathExpand=1" & set "PathSystem=%%I") else if /I "%%H" == "REG_SZ" set "PathSystem=%%I"
    if defined PathSystem goto GetUserPath
)

rem Get directly from Windows registry the user PATH variable value.
:GetUserPath
set "PathUser="
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKCU\Environment" /v "Path" 2^>nul') do if /I "%%G" == "Path" (
    if /I "%%H" == "REG_EXPAND_SZ" (set "PathExpand=1" & set "PathUser=%%I") else if /I "%%H" == "REG_SZ" set "PathUser=%%I"
    if defined PathUser goto SetPath
)

rem Concatenate the two PATH values to a single value.
rem Expand the environment variable references if that is necessary at all.
rem Next replace all two consecutive semicolons by a single semicolon.
rem Last remove semicolon from end of the directories list if there is one.

:SetPath
set "PATH=%PathSystem%;%PathUser%"
if defined PathExpand call set "PATH=%PATH%"
set "PATH=%PATH:;;=;%"
if "%PATH:~-1%" == ";" set "PATH=%PATH:~0,-1%"

rem Output the environment variables PATH and PATHEXT and all other
rem environment variables starting case-insensitive with the string
rem Path as used in this batch file code to see what happened here.
set PATH
endlocal

为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /?
  • reg query /?
  • rem /?
  • set /?
  • setlocal /?

另请阅读 Microsoft 的文章:使用命令重定向运算符 https://technet.microsoft.com/en-us/library/bb490982.aspx的解释2>nul以及 Stack Overflow 主题的答案使用 Windows 批处理文件的单行多个命令 https://stackoverflow.com/a/25344009/3074564对于运算符的含义&在命令行上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何只获取用户路径变量? 的相关文章

  • 使用 xcopy 命令时出现“复制的无效路径 0 个文件”错误

    您好 我有一个小命令可以批量复制文件 这会有所帮助 因为我每天会多次执行此特定复制 使用 xcopy 命令时会出现此问题 一切都按顺序进行 但我收到此错误 复制的路径 0 文件无效 这是代码 C Windows System32 xcopy
  • 在 Windows 系统上移动文件的最快方法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要将大约 800GB 的数据从 NTFS 存储设备移动到 FAT32 设备 两者都是外部硬盘驱动器 在 Windows 系统上 实现这
  • 创建批处理文件以更改 Windows 7 中的电源选项

    有没有办法创建批处理文件并将其放在桌面上以更改 Windows 7 中的电源选项 具体来说 我将计算机设置为 30 分钟后休眠 现在我使用 Serve To Me Stream To Me 应用程序 我希望能够快速更改电源设置以允许连续操作
  • Windows 在 PATH 中搜索可执行文件的相对顺序是什么?

    如果我有a com a cmd a bat and a exe我的文件中的 PATH 如果我只调用该命令 Windows 会选择哪一个a 这是微软官方指定的吗 我只是想包裹我的gvim exe可执行文件 n 但是我的gvim bat似乎既不
  • 如何使用批处理全屏打开窗口

    我之前用代码制作了一个批处理文件 start chrome exe profile directory Profile 1 http drive google com 它会以配置文件 1 用户的身份打开 google chrome 页面 D
  • 在Powershell中执行批处理文件

    我想从批处理文件执行以下命令 C OpenCover tools OpenCover Console exe register user target VS110COMNTOOLS IDE mstest exe targetargs tes
  • 从 ANT 运行 BAT 文件

    我浏览了论坛上的许多帖子 但无法整理出来 我正在尝试从 ANT 脚本运行 BAT 文件 文件夹层次结构是这样的 Project build xml build C test bat 我编写的 ANT 文件是
  • 在文件夹的上下文菜单中运行批处理文件

    当我右键单击任何文件夹时 我想运行此批处理文件 setenv cmd echo off SET CPLUS INCLUDE PATH C mingw32 include C mingw32 lib gcc mingw32 4 9 2 inc
  • ERRORLEVEL 与 %ERRORLEVEL% 与感叹号 ERRORLEVEL 感叹号

    我想我对 ERRORLEVEL 与 ERRORLEVEL 有基本的了解 但是 ERRORLEVEL 让我困惑 我正在制作一个调用可执行文件的脚本 然后使用任务列表来查看它是否正在运行 然后使用taskkill来杀死它 如果是 然后尝试输出错
  • 批处理文件随机删除文本文件的一半行?

    我需要一种方法来使用批处理来查看文本文件的每一行 并删除该文本文件中的一半行 随机选择要删除的行 这是为了模拟 D D 游戏中的锦标赛 我所需要的只是一种方法来淘汰每轮比赛的获胜者 我可以轻松地制作一个批处理文件 复制文本文件并为每一轮重命
  • Windows批处理文件-显示所有子文件夹

    我在使用 Windows 批处理文件返回 JUST 文件夹 忽略文件 时遇到困难 这就是我现在所拥有的 目前它正在返回文件和子子文件夹 for r g in xx do echo g 另外 假设我只想返回以几个不同前缀开头的文件夹 例如 我
  • 阻止 gulp 更改 shell/cmd 标题名称

    当 gulp 被调用时 它会将我的 cmd windows 标题更改为 gulp 我希望窗口名称保持原样 我知道我可以使用https www npmjs com package gulp shell https www npmjs com
  • 根据文件内容重命名文件批处理文件

    我需要一个批处理文件来读取 XYZ txt 文件中存在的描述名称 并根据描述名称重命名该文件名 例如 我有一个名为 nest txt 的文件名 当我们打开文本文件 nest txt 时 文件名的第二行有说明 Description Man
  • Windows批处理文件:在for循环中设置变量

    我有许多具有相同命名方案的文件 作为示例 四个文件分别称为 num 001 001 txt num 002 001 txt num 002 002 txt num 002 003 txt 第一组数字代表它来自哪个 包 第二组数字只是用来区分
  • windows bat 文件中的 bang 字符是什么意思?

    我正在尝试更正一个使用 bang 字符的 bat 文件 我本来期望某种形式的引用 就像是 set some var some var 然后后来 some command some var 看起来第一个是在禁用回显的情况下提示输入 例如提示输
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • 保存并加载 .bat 游戏

    我正在制作一个用bat编写的文本游戏 并且游戏已经完成 或者更多 其中的很大一部分 例如命令 以及可以玩它的阶段 但是 我想添加保存游戏并再次加载的功能 我认为可以通过让 bat 文件写入需要保存的变量 例如项目变量 来做到这一点 但是 我
  • 批处理:在特定程序中打开特定文件?

    当记事本是 txt 文件的默认程序时 如何告诉 Windows 在写字板中打开 C test test txt 接受的答案对我不起作用 我不确定这是因为我试图运行的程序 还是因为路径中有空格 即使我用引号引起来 或者其他原因 不管怎样 我可
  • Windows 批处理文件:如何启用命令的内联回显

    如果在 Windows 批处理文件中默认禁用 echo 是否有办法为特定命令 内联 启用它 我知道可以回显特定命令disabled通过在命令前添加 但是有没有办法做相反的事情呢 例如 假设有一个像这样的批处理文件 echo off cmd1
  • 批量读取INI文件并将其设置为全局变量

    我有一个批处理文件 它已经做了很多事情 并试图扩展它以从 ini 文件中获取一些数据 例如 ini 文件看起来像这样 Settings1 Text Text Text1 Text Text2 Text Settings2 Text Text

随机推荐