如何使用setx添加到Windows PATH变量?有奇怪的问题


78

我想使用修改Windows PATH变量setx。在Windows 8上,以下至少50%的时间有效:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

如果出现错误“默认参数只能使用2次”,则在某些情况下以下工作:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

区别在于我们将第二个参数用引号引起来。我认为引号在%PATH%扩展为包含空格时很有必要。

但是,我在Windows 7上遇到了一些奇怪的问题。在一台特定的Windows 7计算机上,我遇到了以下问题:

echo %PATH%

它打印:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

然后我这样做:

setx PATH "%PATH%;C:\Quux\"

然后显示“错误:截断了1,024个字符。” 现在,让我们检查一下PATH包含哪些内容:

echo %PATH%

它打印:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

...并且被截断为1,024个字符。由于重复,它跑了过来。同样有趣的是:尽管setx存在错误并且没有说“成功” ,但PATH的值仍在变化。

我能够重复几次这种奇怪的行为(幸运的是,我已经保存了PATH的原始内容)。

目前,我知道追加到PATH的唯一肯定方法是:

  1. echo 路径。

  2. 将PATH的内容复制到文本文件中,然后手动添加;C:\Python27\;C:\Python27\Scripts\到PATH的末尾。

  3. 将整个内容复制出文本文件。

  4. setx PATH "<paste the string here>"

该过程在Windows 7和Windows 8上每次都有效。

我真的应该能够在一个命令中做到这一点。我究竟做错了什么?

谢谢。


10
setx出于另一个原因,使用是危险的:如果路径包含任何环境变量(例如)%JAVADIR%\bin,则引用将丢失,即,如果JAVADIR更改,则路径将不再随之更改。如果这是软件安装程序,则可能会破坏最终用户的计算机。这不是一个好主意。
哈里·约翰斯顿

1
@HarryJohnston,这是设计使然。每当您执行操作时%,它都会在现场进行解释。
佩里耶

2
@Pacerier,路径的注册表项中的所有环境变量引用都已经被扩展,这是在构建环境块时发生的。因此,当您%PATH%输入内容时,setx就会丢失此信息。另外,当然,OP的操作方式是将系统路径设置添加到用户路径设置中,再次查看该问题,这似乎是导致OPs问题的真正原因。
哈里·约翰斯顿

2
@HarryJohnston,有4种环境变量:hkcu reg_sz,hkcu reg_expand_sz,hklm reg_sz,hklm reg_expand_sz。(您可以手动调整注册表编辑他们和运行setx,完成冲水。)~~~双方setxsetx/m默认为REG_SZ如果输入包含2+%字符。~~~ hklm和hkcu中的“ expand”均表示扩展为hklm。setx/m qwe %JAVADIR%\binsetx/m javadir asdfg以任一顺序。然后打开一个新的cmd并执行echo %qwe%:可以正常工作。
佩里耶

3
@Pacerier,我看不到相关性。PATH的值已经扩展,并且包含HKCU和HKLM条目(后者是一种特殊情况,对于任何其他环境变量都不会发生),因此,如果最初包含HKLM中的路径,而最初包含%JAVADIR%\binHKCU中的路径包含%JDK%\bin随后PATH将被设置为C:\Java\bin;C:\jdk\bin当你这么说setx PATH %PATH%在HKCU的值更改为C:\Java\bin;C:\jdk\bin其中(a)包含冗余项和(b)不再跟踪更改为JDK的价值。
哈里·约翰斯顿

Answers:


75

cmd以管理员身份运行,然后:

setx /M PATH "%PATH%;<your-new-path>"

/ M选项在SYSTEM范围内设置变量。默认行为是为USER设置它。

TL; DR

发生截断问题是因为当您回显%PATH%时,它将显示SYSTEM和USER值的串联。因此,当您将其添加到setx的第二个参数中时,它将适合USER变量中的SYSTEM和USER值。当您再次回声时,事情将会加倍。

另外,/ M选项需要管理员特权,因此您需要使用“以管理员身份运行”打开终端,否则setx将抱怨“拒绝访问注册表路径”。

最后要注意的一点:以这种方式设置后,在回显%PATH%之后,您将看不到新值,您需要cmd再次关闭并打开。

如果要检查存储在注册表中的实际值,请检查此问题


25
该解决方案是伪造的。执行上述命令会将您的Path类型从更改REG_EXPAND_SZREG_SZ;然后在此过程中删除那里存在的所有环境变量引用。
user2023370

@garyM感谢您的反馈。我没有遇到/注意到我所提到的后果。请让我们知道是否有修改此答案的方法可以解决该问题。或者,如果您提出其他答案。
Vituel

2
嗨,Vituel,当新创建变量然后在同一过程中对其进行修改时,会发生此问题。新创建的变量不会显示在现有的shell环境中。任何引用都将引用%var%视为文本字符串。为避免此问题,必须在创建变量后创建的新进程中执行对变量的访问。在某些版本的Windows上,path变量是一种特殊情况。在2008R2中,不会将PATH变量的修改升级为现有进程,需要重新实例化它们才能获取更改。基于OS,/ M位于末尾。
garyM 2015年

2
同样,这导致将用户PATH变量附加到计算机PATH上,这将(a)干扰其他用户;(b)如果反复运行,请继续增加路径的长度,直到最终溢出为止。 大多数情况下,不会为PATH设置用户设置,因此您可以摆脱它,但这很危险。
哈里·约翰斯顿

3
请勿使用此功能。setx会将PATH截断为1024个字符。如果之前通过添加更多目录来更改PATH,则将丢失大部分原始PATH内容
e.tadeu

22

这完美地工作:

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

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

第一个命令将USER环境变量'PATH'放入'my_user_path'变量中。第二行在'C:\ Python27; C:\ Python27 \ Scripts;'之前添加 到USER环境变量“ PATH”


2
这个答案在逻辑上是正确的imo。为什么这个答案既没有获得更多的选票,也没有被接受?我错过了什么吗?
西瓦·桑卡兰

Coz stackoverflow(SO)没有获得其用户的反馈:-)。如果有人说答案是合乎逻辑的,那么这应该是类似于Quora中的固定答案。像您这样的读者应该能够找到好的答案。SO很好,但是不幸的是,它不会随着时间而改变。我们甚至不能像这样标记它,@stackoverflow,没人听。
Manohar Reddy Poreddy,

2
@AMVaddictionist-我认为%%或%与.bat文件或直接在cmd中运行有关。希望能有所帮助。
Manohar Reddy Poreddy

2
同意。这是正确的答案。如所写,它用于在命令提示符下运行,并且必须将单个%替换为双%%才能在批处理文件中运行。
乔纳森·

1
@mozilla_firefox-是的,我们进行备份,然后尝试一些新的方法:),我们是合适的开发者?:D
Manohar Reddy Poreddy

5

如果有人想在PowerShell中运行它,如下所示,

以管理员身份运行Powershell

然后

setx /M PATH "$Env:PATH;<path to add>"

要进行验证,请打开另一个Powershell并查看以下PATH,

$Env:PATH

4

如果您不了解setx,可以使用替代的命令行工具,例如pathed。在/superuser/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712中有更全面的PATH编辑器列表

您也可以直接编辑注册表值setx。这个答案更多。

奇怪的是您%PATH%被截断为1024个字符。我以为setx没有问题。虽然您可能应该清理无效的路径条目。


5
感谢您的建议,但我真的不想依赖第三方软件。我只想使用Windows附带的功能。这是因为我有两个主要用例:(1)设置要学习Python的新手,以及(2)设置公司工厂中使用的计算机。在这两种情况下,它都是一台随机的Windows计算机,仅对PATH进行了一次编辑。我想使PATH编辑尽可能容易,并且安装更多软件确实不能解决问题。这就是为什么我的四步解决方案都不够好的原因。
SerMetAla

因此,我链接的工具具有可移植的二进制文件,您可以将它们捆绑在zip文件中。您可以让用户执行与运行.bat文件一样简单的事情,并让用户处理PATH编辑以及设置Python代码。
Ehtesh Choudhury 2013年

4

没有管理员权限,唯一适合我的方法是bat文件,其中包含以下代码:

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

该代码是答案https://stackoverflow.com/a/45566845/4717152https://stackoverflow.com/a/10292113/4717152的组合


如果您希望路径的那部分遵循对%USERPROFILE%的更改,则可以%%在bat文件中使用double (或者^%如果直接运行命令-请参阅如何在bat vs cmd中进行转义)。
TamaMcGlinn

3

我遇到了同样的问题,现在找到了一个简单的解决方案。

使用路径管理员。

pathman /as %M2%

例如,将%M2%添加到系统路径。一无所有。混合使用用户PATH和系统PATH不再有问题。几乎没有其他尝试从注册表中获取正确的值了...

在Windows 10上试用



@PatMigliaccio您的链接已死
TamaMcGlinn

2
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

这应该在不添加任何额外内容的情况下追加到系统环境变量路径,并保持原始数据完整无损。我已使用此命令更正了McAfee Web Control对Microsoft Outlook桌面客户端所做的问题。

路径值中使用了引号,因为命令行将空格视为定界符,并将尝试在命令行中执行下一个值。引号覆盖此行为,并将引号内的所有内容作为字符串处理。


0

步骤:1。打开具有管理员权限的命令提示符。

步骤:2。运行命令:setx / M PATH“ path \ to;%PATH%”

[注意:请确保更改命令,以使path \ to反映根目录下的文件夹路径。

示例:setx / M PATH“ C:\ Program Files;%PATH%”


4
OP为他的问题描述了一些细节和观察。OP描述了解决他的问题的几种尝试。其中一些与您的建议非常相似。您能否突出说明相关差异并解释它们如何解决OP问题?
Yunnosch '17


0

遗憾的是,使用OOTB工具,您无法直接/轻松地添加系统路径或用户路径。如果要使用OOTB工具,则必须查询SYSTEM或USER路径,将该值另存为变量,然后附加添加的内容并使用setx保存。下面的两个示例显示了如何检索,保存它们以及附加您的添加内容。不要与%PATH%混为一谈,它是USER + SYSTEM的串联,将导致大量重复结果。您必须按如下所示拆分它们...

附加到系统路径

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

附加到用户PATH

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

setx PATH "%userPATH%;C:\path3;C:\path4"

0

此vbscript /批处理混合“ append_sys_path.vbs”不直观,但效果很好:

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

这种方法的优点:

1)不会将系统路径环境截断为1024个字符。
2)它不连接系统和用户路径环境。
3)它以管理员身份自动运行。
4)保留系统路径环境中的百分比。
5)支持空格,括号和特殊字符。
6)在Windows 7及更高版本上运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.