使用" setx"语法无效;当只有两个参数时,有两个以上的参数

时间:2015-03-22 02:56:25

标签: cmd environment-variables windows-8.1 setx

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

我已阅读Invalid syntax with setx等类似问题的答案,并阅读SS64上的语法。

据我所知,以下行正确遵循SETX的语法,并且 NOT 中包含两个以上的参数:

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 permenantly。 (需要管理员访问权限)

3 个答案:

答案 0 :(得分:7)

 echo %PATH%

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

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

资源:Syntax : Escape Characters, Delimiters and Quotes(请注意以下引文中我自己的要点):

  

某些命令(例如REGFINDSTR)使用标准转义字符   \的句子(由C,Python,SQL,bash和许多其他语言使用。)\   转义可能导致包含a的带引号的目录路径出现问题   尾部反斜杠,因为该行末尾的结束引用"   将被转义\"

     

要保存带有反斜杠(\)的目录路径,需要添加   第二个反斜杠'逃避逃脱' 所以例如代替   "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错误与首次使用%PATH%导致的用户级SETX PATH "%PATH%"变量有关,因为用户级环境变量优先于计算机级别1。要解决此问题,请先调整用户级%PATH%变量(或根本删除它){/ 3}}:

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"

==>

答案 1 :(得分:1)

以下为我工作:

第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%

答案 2 :(得分:0)

这意味着它已经在路径中了(我已经和setx战斗了几天,这是愚蠢的)。

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