我有一个包含系统级配置的系统 PATH 变量。我使用用户 PATH 变量来补充具有用户特定配置的 PATH。
我想更新用户 PATH 变量从命令行例如使用 setx。
但是我不知道如何在setx中引用现有的用户路径。
在以下命令中(不带 /M 的 setx)
setx PATH c:\my-user-specifc-bin-path;%PATH%
第一个 PATH 表示用户 PATH,但第二个 %PATH% 将被“完整”(用户 + 系统) PATH 替换。
所以这意味着整个系统路径将在用户 PATH 中重复……这绝对不是我想要的。
我想:
- 仅影响用户 PATH 环境变量
- 将一个或多个路径元素附加/添加到现有值
- 从命令行执行。
答案1
PowerShell 版本,为用户设置 PATH:
- 为当前用户设置新路径(覆盖):
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
- 设置附加到当前用户路径:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
- 设置当前用户 PATH 的前缀:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"
答案2
要设置用户路径并覆盖任何先前的值:
setx PATH "C:\MyPath1"
要将值“C:\MyPath0”添加到现有的用户 PATH 前面:
for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "C:\MyPath0;%~a" ) else ( @setx PATH "C:\MyPath0;%~a %~b" )
要将值“C:\MyPath2”附加到现有的用户 PATH:
for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "%~a;C:\MyPath2" ) else ( @setx PATH "%~a %~b;C:\MyPath2" )
因为用户路径可能包含空格,也可能不包含空格,所以 if-else 条件是必需的。如果您愿意,可以将命令保存为通用批处理文件(确保将每个 % 符号加倍),这些文件接受要设置/添加/附加的值作为参数。
批处理文件
:: PATH-ADD - add a path to user path environment variable
@echo off
setlocal
:: set user path
set ok=0
for /f "skip=2 tokens=3*" %%a in ('reg query HKCU\Environment /v PATH') do if [%%b]==[] ( setx PATH "%%~a;%1" && set ok=1 ) else ( setx PATH "%%~a %%~b;%1" && set ok=1 )
if "%ok%" == "0" setx PATH "%1"
:end
endlocal
echo.
答案3
需要SETX /M
,默认SETX
设置为HKEY_CURRENT_USER
SETX /M PATH c:\my-bin-path;%PATH%
答案4
这似乎有效:
setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%