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

Ser*_*Ala 67 windows cmd path setx

我想使用修改Windows PATH变量setx.以下在Windows 8上至少有50%的时间可以正常工作:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\
Run Code Online (Sandbox Code Playgroud)

如果它给出错误"默认参数只能使用2次",那么下面的部分时间会起作用:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"
Run Code Online (Sandbox Code Playgroud)

不同之处在于我们将第二个参数包装在引号中.我相信%PATH%扩展包含空格时引号是必要的.

但是,我在Windows 7上遇到了一些奇怪的问题.在一台特定的Windows 7机器上,我遇到了这个问题:

echo %PATH%
Run Code Online (Sandbox Code Playgroud)

它打印:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

setx PATH "%PATH%;C:\Quux\"
Run Code Online (Sandbox Code Playgroud)

然后它说"错误:截断1,024个字符." 现在让我们检查一下PATH包含的内容:

echo %PATH%
Run Code Online (Sandbox Code Playgroud)

它打印:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B
Run Code Online (Sandbox Code Playgroud)

......它被裁减为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上每次都有效.

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

谢谢.

Vit*_*uel 69

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

setx /M PATH "%PATH%;<your-new-path>"
Run Code Online (Sandbox Code Playgroud)

/ M选项将变量设置为SYSTEM范围.默认行为是为USER设置它.

TL; DR

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

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

最后要注意的事项:当您以这种方式设置回显%PATH%后,您将看不到新值,您需要关闭cmd并再次打开.

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

  • 这个解决方案是假的.执行上面的命令会将`Path`类型从`REG_EXPAND_SZ`改为`REG_SZ`; 并在此过程中,删除那里存在的所有环境变量引用. (18认同)
  • 不要使用这个。`setx` 会将 PATH 截断为 1024 个字符。如果之前通过添加更多目录来更改 PATH,*您将丢失大部分原始 PATH 内容*! (5认同)
  • 此外,这会导致用户 PATH 变量被附加到机器 PATH,这将 (a) 干扰其他用户;(b) 如果重复运行,继续增加路径的长度,直到它最终溢出。*大多数* PATH 不会有用户设置,因此您可以逃脱它,但它很危险。 (3认同)
  • 嗨 Vituel,当变量是新创建的,然后在同一进程中修改时会出现问题。新创建的变量不会出现在现有的 shell 环境中。任何引用都会将引用 %var% 视为文本字符串。为避免此问题,必须在创建变量后创建的新进程中执行对变量的访问。路径变量是某些版本的 Windows 上的特例。在 2008R2 中,PATH 变量的修改不会提升到现有进程,需要重新实例化它们才能获得更改。基于操作系统,/M 在最后。 (2认同)

Man*_*ddy 13

这非常有效:

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%"
Run Code Online (Sandbox Code Playgroud)

第一个命令获取USER环境变量'PATH',变为'my_user_path'变量第二行前置'C:\ Python27; C:\ Python27\Scripts;' 到USER环境变量'PATH'

  • 在我看来,这个答案在逻辑上是正确的。为什么这个答案既没有得到更多选票也没有被接受?我错过了什么吗? (2认同)
  • @AMVaddictionist-如果您将其作为.bat文件或直接在cmd中运行,我认为%%或%与之有关。希望能有所帮助。 (2认同)
  • 同意。这是正确的答案。正如所写,它用于在命令提示符中运行,并且必须将单个 % 替换为双 %% 才能在批处理文件中运行。 (2认同)
  • @ManoharReddyPoreddy谢谢,上帝拯救了我,虽然我已经备份了环境变量,但与任何其他答案相比,这个答案是一个宝石。首先存储上一个环境变量,然后追加新的环境变量。效果很好:) (2认同)

NIK*_*NIK 5

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

以管理员身份运行Powershell

然后

setx /M PATH "$Env:PATH;<path to add>"
Run Code Online (Sandbox Code Playgroud)

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

$Env:PATH
Run Code Online (Sandbox Code Playgroud)


Eht*_*ury 4

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

您还可以直接编辑注册表值,这就是它的setx作用。更多内容在这个答案中中。

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

  • 感谢您的建议,但我真的不想依赖第三方软件。我只想使用 Windows 附带的东西。这是因为我有两个主要用例:(1) 设置想要学习 Python 的新手,以及 (2) 设置在我公司工厂中使用的机器。在这两种情况下,它都是随机的 Windows 计算机,只会编辑一次 PATH。我想让 PATH 编辑尽可能简单,安装更多软件确实无法解决问题。这就是为什么我的四步解决方法还不够好。 (6认同)