【问题标题】:Windows batch, select ONLY user variablesWindows 批处理,仅选择用户变量
【发布时间】:2012-11-13 10:28:54
【问题描述】:

在环境变量中,我有一个用于用户变量和系统变量的 PATH 变量。

在批处理脚本中,为了给用户 PATH 变量附加一个新的给定路径,我需要选择当前值。不幸的是 %PATH% 返回用户变量和系统变量的组合。

当然我只想给用户变量添加一个新的自定义路径值。使用系统路径来增强它也没有意义。这就是为什么我有 2 个变量。

提前致谢。

编辑:在文档中找到以下语句:

%PATH% 变量同时设置为系统变量和用户变量,这两个值结合起来给出当前登录用户的 PATH....

例子:

用户变量:

PATH
value: c:\dev

系统变量

PATH
value: c:\Program Files

我想要做的,是将值添加到用户变量:c:\tmp,这样最终 PATH 将具有值:c:\dev;c:\tmp

但是,如果打开一个 cmd 窗口:

echo %PATH%
c:\Program Files;c:\dev

所以 setx 将执行以下操作

setx path "%path%;c:\tmp"

打开新的 cmd

echo %PATH%
c:\Program Files;c:\dev;c:\tmp

这是错误的,因为我只需要 c:\dev;c:\tmp

我希望这次我更清楚了。

【问题讨论】:

  • 如果您已经拥有USERPATH,那么为什么不简单地添加到%USERPATH%
  • 我没有 %USERPATH%。这两个变量都称为 %PATH%
  • 你应该举个例子,我从你的描述中完全看不懂。
  • 那么简而言之,你想echo用户path,而不是系统和用户的组合?
  • 是的:)。因为设置很清楚,但我需要知道我在设置什么

标签: windows batch-file


【解决方案1】:

你是如何修改变量的?

只有一个环境变量PATH,所以你可以继续改变它。这些更改是暂时的(对于您的进程及其子进程而言是本地的)。

在 Registry 中有两个(实际上更多)持久性位置,在创建进程时会从这些位置初始化环境变量。您可以使用reg 实用程序修改它们。没有歧义,因为它们是分开的:

  • HKEY_CURRENT_USER\环境
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

您可能必须重新登录才能使注册表中的更改生效(我不记得是否有程序化的方式来通知资源管理器这些设置已更改)。另请注意,默认情况下,子进程继承其父进程的环境(除非父进程采取特殊措施否则),例如如果您启动 cmd 窗口并稍后通过系统设置对话框修改环境,则从该 cmd 启动的应用程序将看不到更改。

[UPD] 您可以使用reg 实用程序从注册表中获取用户特定环境变量的值:

reg query HKCU\Environment /v PATH

尽管您必须过滤其输出以获取实际值,因为它会吐出一些无用的文本。这里是一个示例咒语:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set value=%B

它将结果存储在环境变量value中。在批处理文件中使用 % 时,记得将其加倍。

【讨论】:

  • 我已经在尝试从注册表中获取值,但是您更快地给了我命令:) 我会看看我是否可以清理输出。如果我这样做,我会更新我的问题。非常感谢。
  • 再次感谢 :) 日复一日地提醒我为什么我喜欢 Linux bash 脚本而不是 windows 批处理。
  • @bioShark 是的,批量编写总是一种特殊的体验 :) 请注意,我必须再次编辑这个单行,因为以前的版本没有正确处理空格。
  • 要在更新注册表环境设置时通知所有顶级窗口(包括资源管理器),请发送WM_SETTTINGCHANGE 消息,并将lParam 设置为L"Environment"。 Explorer 调用未记录的函数shell32!RegenerateUserEnvironment 来重新加载其环境。请注意,setx.exe 发送 WM_SETTTINGCHANGE 消息,但 reg.exe 不发送。 cmd.exe 与大多数控制台应用程序一样,没有用于侦听此消息的顶级窗口,因此只有 cmd.exe 的后续实例具有更新的环境。
【解决方案2】:

如果我理解您的问题,您有 2 个 %PATH% 变量。一个系统一个,一个用户一个,(大概是你自己创建的)。

我已经尝试过了,它似乎适用于用户环境变量

setx /s computername PATH %PATH%;newpathvalue

当我对此进行测试时,我实际上用 PATH 替换了一个新的 var 以确保它可以正常工作,但最好在执行此操作之前复制现有的 var,以防万一。

它将使用您指定的新值标记到现有用户环境变量 PATH 的末尾,并用分号 ; 将其与其他变量分隔。

希望对你有帮助

【讨论】:

  • 这是有效的,但问题是 %PATH% (当你回显时,PATH 的值)结合了 2 个 PATH 变量。摘自原始文档:%PATH% 变量同时设置为系统变量和用户变量,这两个值结合起来给出当前登录用户的 PATH。
  • 我不太确定您想要完成什么,您是否只是想回显用户 %path%?
  • 我将用更详细的示例更新我的原始问题。给我2分钟。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多