Windows批处理,只选择用户变量

bio*_*ark 6 windows batch-file

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

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

当然我只想为用户变量添加一个新的自定义路径值.用系统路径增强它也没有意义.这就是我有2个变量的原因.

提前致谢.

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

%PATH%变量设置为系统变量和用户变量,组合2个值以为当前登录用户提供PATH ....

例:

用户变量:

PATH
value: c:\dev
Run Code Online (Sandbox Code Playgroud)

系统变量

PATH
value: c:\Program Files
Run Code Online (Sandbox Code Playgroud)

我想要做的是,在用户变量中添加值:c:\ tmp,以便最后PATH将具有值:c:\ dev; c:\ tmp

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

echo %PATH%
c:\Program Files;c:\dev
Run Code Online (Sandbox Code Playgroud)

所以setx将执行以下操作

setx path "%path%;c:\tmp"
Run Code Online (Sandbox Code Playgroud)

打开新的cmd

echo %PATH%
c:\Program Files;c:\dev;c:\tmp
Run Code Online (Sandbox Code Playgroud)

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

我希望这次我更清楚.

atz*_*tzz 9

你是如何修改变量的?

只有一个环境变量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
Run Code Online (Sandbox Code Playgroud)

虽然你必须过滤其实际值的输出,因为它会吐出一些无用的文本.这是一个示例咒语:

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

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

  • 要在更新注册表环境设置时通知所有顶级窗口(包括资源管理器),请发送带有`lParam`集的[`WM_SETTTINGCHANGE`](https://msdn.microsoft.com/en-us/library/ms725497)消息到'L"环境"`.Explorer调用未记录的函数`shell32!RegenerateUserEnvironment`来重新加载其环境.请注意,`setx.exe`发送`WM_SETTTINGCHANGE`消息,但reg.exe不发送.与大多数控制台应用程序一样,cmd.exe没有顶级窗口来侦听此消息,因此只有cmd.exe的后续实例具有更新的环境. (2认同)