如何使用setx将内容添加到Windows PATH变量?遇到了一些奇怪的问题。
如何使用setx将内容添加到Windows PATH变量?遇到了一些奇怪的问题。
我想使用setx
命令修改Windows的PATH变量。以下命令在Windows 8上至少50%的情况下有效:
setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\
如果出现错误"the default argument can only be used 2 times",则以下命令在某些情况下有效:
setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"
两者的区别在于第二个参数加了引号。我相信当%PATH%
扩展包含空格时,引号是必需的。
然而,在Windows 7上我遇到了一些奇怪的问题。在一个特定的Windows 7机器上,我遇到了这个问题:
echo %PATH%
输出:
C:\Foo\;C:\Bar\;[...很多内容...]C:\Baz\
然后我执行以下命令:
setx PATH "%PATH%;C:\Quux\"
然后它显示"Error: Truncated at 1,024 characters." 现在我们来检查一下PATH的内容:
echo %PATH%
输出:
C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...很多内容,现在重复了...]C:\B
...而且被截断到了1,024个字符。它由于重复而超过了限制。还有趣的是:尽管setx
产生了错误并且没有显示"Success",PATH的值仍然发生了改变。
我能够多次重复这种奇怪的行为(幸运的是我保存了PATH的原始内容)。
目前,我唯一确定的追加到PATH的方法如下:
echo
输出PATH的内容。- 将PATH的内容复制到一个文本文件中,并手动在末尾添加
;C:\Python27\;C:\Python27\Scripts\
。 - 将整个内容从文本文件中复制出来。
setx PATH "<粘贴字符串>"
这个过程在Windows 7和Windows 8上每次都有效。
我真的应该能够用一条命令完成这个操作。我做错了什么?
问题出现的原因:
使用setx命令向Windows PATH变量添加内容时出现了奇怪的问题。
解决方法:
1. 确保不会干扰系统范围的PATH变量。只有用户特定的部分会被读取、修改和写入到注册表中。
2. 第一条命令从注册表中获取用户特定的PATH部分,并将其存储到名为my_user_path的变量中。确保第一条命令没有错误。
3. 第二条命令将"C:\Python27;C:\Python27\Scripts;"添加到my_user_path的值的前面,并将其写回到用户特定的注册表键中。
4. 只有重新启动的程序才会看到PATH环境变量的更改。
如果在.bat文件中使用这些命令,请在第一行的两个位置都用"%%"替换"%":
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%%B
其他回答中提到的内容:
- 在命令提示符中运行时,使用单个"%"。在批处理文件中运行时,将单个"%"替换为"%%"。
- 这是正确的答案,但没有得到更多的投票或被接受的原因可能是Stack Overflow(SO)没有考虑用户的反馈意见。读者应该能够将好的答案固定在顶部。
- 使用setx /?命令可以简化操作,因为它具有内置的读取注册表值的功能。
- 第二部分的解决方法可能会破坏用户的PATH。
希望以上整理对您有帮助。
问题原因:使用setx命令将路径添加到Windows的PATH变量时出现问题。主要原因是在使用setx命令的第二个参数中,当将系统的PATH和用户的PATH进行拼接时,会导致路径内容过长而被截断。
解决方法:以管理员身份运行cmd命令行窗口,然后使用以下命令:
setx /M PATH "%PATH%;<your-new-path>"
其中,/M选项将变量设置为系统范围。默认行为是设置为用户范围。
需要注意的是,使用/M选项需要管理员权限,因此需要以“以管理员身份运行”打开终端,否则setx命令将因为“访问注册表路径被拒绝”而失败。
另外,设置完新的路径后,如果立即使用echo命令查看PATH变量的值,是看不到新值的,需要关闭cmd窗口并重新打开。
如果想要查看注册表中实际存储的值,可以参考这个问题。
需要注意的是,此解决方案是有问题的。执行上述命令会将Path的类型从REG_EXPAND_SZ更改为REG_SZ,并在此过程中删除其中存在的所有环境变量引用。
最后,还有一些反对使用该方法的意见。首先,此方法将用户的PATH变量追加到机器的PATH变量中,这可能会干扰其他用户,并且如果重复运行该命令,路径的长度将不断增加,直到最终溢出。其次,如果之前已经通过在前面添加更多目录来更改了PATH,那么使用setx命令会导致原始PATH内容的大部分丢失。
因此,不建议使用此方法。