我想使用setx
修改Windows的PATH变量。以下代码在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的方法如下:
echo
PATH。将PATH的内容复制到文本文件中,并手动在末尾添加
;C:\Python27\;C:\Python27\Scripts\
。将整个内容从文本文件复制出来。
setx PATH "<粘贴字符串>"
这个过程在Windows 7和Windows 8上每次都有效。
我真的应该能够用一条命令完成这个操作。我做错了什么?
setx
的另一个危险之处在于:如果路径包含任何环境变量,例如%JAVADIR%\bin
,则引用将丢失,即如果JAVADIR更改,则路径将不再随之更改。如果这是软件安装程序,可能会破坏最终用户的计算机。不是一个好主意。 - Harry Johnston%
时,它会立即进行解释。 - Pacerier%PATH%
输入到setx
中时,您会丢失此信息。另外,当然,OP正在做的方式是将系统路径设置添加到用户路径设置中,再次查看问题,看起来这才是OP问题的真正原因。 - Harry Johnstonsetx
来完成刷新。)如果您的输入包含2个以上的“%”字符,则setx
和setx / m
默认为reg_sz类型。无论是在hklm还是hkcu中,"expand"都意味着将其扩展到hklm。以任何顺序运行setx/m qwe %JAVADIR%\bin
和setx/m javadir asdfg
,然后打开新的命令提示符窗口并执行echo %qwe%
:结果符合预期。 - Pacerier%JAVADIR%\bin
,而HKCU中的路径最初包含%JDK%\bin
,那么PATH
将被设置为C:\Java\bin;C:\jdk\bin
,所以当您使用setx PATH %PATH%
时,HKCU中的值将更改为C:\Java\bin;C:\jdk\bin
,其中(a)包含多余的条目,(b)不再跟踪JDK值的更改。 - Harry Johnston