9

我无法PATH永久设置全局环境变量SETX

我已经阅读了类似问题的答案,例如Invalid syntax with setx以及阅读SS64上的语法。

据我所知,以下行SETX正确地遵循了语法,并且其中没有两个以上的参数:

SETX PATH "%PATH%"

但这并没有停止SETX给我这个错误:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.

上面的命令是在管理员实例上运行的cmd.exe。使问题更加奇怪的是,在同一命令的用户实例上可以完美运行。cmd.exe

我简化了上面的命令来强调这个问题,但我真正想要运行的是:

SETX PATH "%PATH%;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin" /M

当然,这给出了完全相同的错误,我无法在用户实例上运行它,cmd.exe因为我试图永久设置全局环境变量PATH。(需要管理员权限)

4

3 回答 3

10
 echo %PATH%

如果您的(机器级别)%path%以尾随\反向固线(反斜杠)结尾,则应将其加倍,如下所示:

if "%path:~-1%"=="\" (
   SETX PATH "%PATH%\"
) else (
   SETX PATH "%PATH%"
)

资源:语法:转义字符、分隔符和引号(请注意以下引文中我自己的亮点):

某些命令(例如REGFINDSTR)使用标准转义字符 of \(如 C、Python、SQL、bash 和许多其他语言所使用的那样)。\ 转义可能会导致包含尾随反斜杠的引用目录路径出现问题,因为末尾的右"引号的行会被转义\"

要保存带有尾部反斜杠 ( \) 的目录路径,需要添加第二个反斜杠以“转义转义”,例如,而不是 "C:\My Docs\"使用"C:\My Docs\\"

上述关于尾随的陈述\也适用于 SETX。这是一个例子:

==>set myPath
myPath=D:\Program Files\OgreSDK\

==>setx myOgre "%myPath%"
SUCCESS: Specified value was saved.

==>reg query HKEY_CURRENT_USER\Environment /v myOgre
HKEY_CURRENT_USER\Environment
    myOgre    REG_SZ    D:\Program Files\OgreSDK"

==>setx myOgre "%myPath%\"
SUCCESS: Specified value was saved.

==>reg query HKEY_CURRENT_USER\Environment /v myOgre
HKEY_CURRENT_USER\Environment
    myOgre    REG_SZ    D:\Program Files\OgreSDK\

==>

该错误与第一次使用用户级别环境变量导致的Invalid syntax用户级别变量损坏有关,该用户级别环境变量优先于机器级别一。要解决此问题,请先通过 Windows GUI(首选)调整用户级别变量(或完全删除它) :%PATH%SETX PATH "%PATH%"%PATH%

Control Panel | System | Advanced | Environment Variables

证明 -分两步重现问题:

步骤#1:从%myPath%机器级别的良好变量开始,尾随\; 最后(很好)打破了当前用户级别和会话exit的这个变量。cmd

==>set myPath
myPath=D:\temp\foo foo\

==>reg query HKEY_CURRENT_USER\Environment /v myPath
ERROR: The system was unable to find the specified registry key or value.

==>reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v myPath
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    myPath    REG_SZ    D:\temp\foo foo\

==>setx myPath "%myPath%;D:\temp\bu bu bu"
SUCCESS: Specified value was saved.

==>reg query HKEY_CURRENT_USER\Environment /v myPath
HKEY_CURRENT_USER\Environment
    myPath    REG_SZ    D:\temp\foo foo\;D:\temp\bu bu bu

==>rem fetch erroneous state
==>setx myPath "%myPath%"
SUCCESS: Specified value was saved.

==>reg query HKEY_CURRENT_USER\Environment /v myPath
HKEY_CURRENT_USER\Environment
    myPath    REG_SZ    D:\temp\foo foo"

==>exit

步骤#2:在一个新cmd会话中,从用户级别的损坏%myPath%变量开始,尾随"; 这会引发所描述的错误。

==>set myPath
myPath=D:\temp\foo foo"

==>reg query HKEY_CURRENT_USER\Environment /v myPath
HKEY_CURRENT_USER\Environment
    myPath    REG_SZ    D:\temp\foo foo"

==>reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v myPath
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    myPath    REG_SZ    D:\temp\foo foo\

==>setx myPath "%myPath%;D:\temp\bu bu bu"
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.

==>reg query HKEY_CURRENT_USER\Environment /v myPath
HKEY_CURRENT_USER\Environment
    myPath    REG_SZ    D:\temp\foo foo"

==>
于 2015-03-22T12:47:44.567 回答
2

下面为我​​工作:

第1步:

setx PATH "%PATH%;%GOPATH%bin"  

我得到以下回复:

WARNING: The data being saved is truncated to 1024 characters.  

SUCCESS: Specified value was saved.  

另一个更简单的例子可能是:

setx PATH "%PATH%;C:\Go\bin"  

第2步:

重启命令行,查看新的路径设置

echo %PATH%
于 2015-11-11T22:19:03.470 回答
0

这意味着它已经在路上了(我已经和 setx 战斗了几天,这很愚蠢)。

您可以添加相同的现有条目或添加新条目而不会出错,但不能添加不同的条目。每个用户的路径是空白的,每台机器的路径不是空白的。

于 2015-03-22T06:10:31.360 回答