想象一下以下环境变量:
系统路径 = C:\Windows
Bob 的用户路径 =C:\Users\Bob
在命令提示符中,PATH
命令返回C:\Windows;C:\Users\Bob
跑步后setx /m PATH "C:\Node;%PATH%"
系统路径 =C:\Node;C:\Windows;C:\Users\Bob
在新的命令提示符下,PATH
命令返回C:\Node;C:\Windows;C:\Users\Bob;C:\Users\Bob
另一个用户 Alice 登录。Alice
的用户路径 =C:\Users\Alice
在命令提示符下,PATH
命令返回C:\Node;C:\Windows;C:\Users\Bob;C:\Users\Alice
Bob 的变量中有一个重复的路径PATH
,而 Alice 的变量中也有 Bob 的路径PATH
。
有没有办法将其附加到系统中PATH
而不被当前用户污染PATH
?
答案1
在 Windows 7 中,你可以使用以下命令查找系统路径
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path
如果该功能在 Windows 8 上仍然有效,则使用它来构建新值。
您必须弄清楚如何解析 的输出reg query
。以下是可能有用的方法:
对于/f“tokens=1,2*”%a在(' reg query“HKLM\…\Environment”/v path ')中设置currentValue=%c
在哪里
- 该字符串是用单引号括起来的命令(上面给出)。
'reg query "HKLM\…\Environment" /v path'
reg query
a
、currentValue
和c
是变量名。你可以选择任何你想要的变量名,但必须满足以下限制:a
和c
必须是单个字母,相隔两个字母(例如,你可以使用n
andp
、或x
andz
)。-
for /f "options" %variable in ('command1') do command2
运行,解析输出,将值分配给(),(见上文;但也请参见下文)并执行。command1
%variable
%a
command2
tokens=1,2*
意味着%a
获取每一行(剩余)的第一个标记(单词),%b
获取第二个单词,然后%c
获取该行的其余部分。- 第一个单词是
path
(值名称)。 - 第二个词是
REG_EXPAND_SZ
(值类型)。 - 该行的其余部分是值。
(您可以直接使用
tokens=2*
然后currentValue=%b
。)- 第一个单词是
因此,执行上述操作后,你应该能够做到
setx PATH "C:\Node;%currentValue%" /m
.BAT
如果在脚本(文件)中执行此操作,请使用%%a
和%%c
。echo
在使用之前,请务必先使用命令进行测试setx
。
答案2
不要将 Bob 的特定路径放在每个人都使用的系统路径值中。
读取系统路径的旧值,修改它,然后设置新值。如果cmd.exe
(显然该set
命令可以创建/修改/删除但不能读取)不提供这些功能,请将其放入批处理文件调用的程序中。
系统路径值是通过注册表找到(并更改)的。我只需搜索我知道它必须准确发现的值,然后使用 Google 搜索该关键路径以检查有关它的说法。
(后来:它们是HKLM\System\CurrentControlSet\Control\Session Manager\Environment
和HKCU\Environment
)
任何更高级的 Windows 脚本语言或支持 Windows API 的脚本语言都可以处理该问题。或者,以您选择的语言编译的可执行程序。
CMD 替换 shell掌控全局有一个@REGQUERY 函数:
echo %@REGQUERY["HKLM_64\System\CurrentControlSet\Control\Session Manager\Environment\Path"]
因为听起来你已经想到了一台特定的机器,你可以安装TCC/LE(免费)并使用它来解释您的批处理文件。