【问题标题】:Invalid syntax with "setx" for having more than two arguments when there are only two arguments当只有两个参数时,具有两个以上参数的“setx”语法无效
【发布时间】:2015-05-25 06:34:32
【问题描述】:

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

我已经阅读了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。 (需要管理员权限)

【问题讨论】:

    标签: cmd environment-variables windows-8.1 setx


    【解决方案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】:
       echo %PATH%
      

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

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

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

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

      要保存带有尾部反斜杠 (\) 的目录路径,需要添加 'escape the escape' 的第二个反斜杠,例如,而不是 "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 错误与第一次使用 SETX PATH "%PATH%" 作为用户级环境变量优先于机器级环境变量导致的用户级 %PATH% 变量损坏有关。要解决这个问题,首先调整用户级别%PATH%变量(或完全删除)via Windows GUI (preferred)

      Control Panel | System | Advanced | Environment Variables

      证明 - 重现问题分两步:

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

      ==>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"
      
      ==>
      

      【讨论】:

      • 实际上,我确定它以; 结尾,如果不是则以文件夹名称结尾,但绝对不是以\。此外,在撰写本文时,用户级别不存在 PATH 变量。
      【解决方案3】:

      表示它已经在路上了(我已经和setx打了好几天了,很傻)。

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

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 2020-05-10
        • 2022-12-18
        • 1970-01-01
        相关资源
        最近更新 更多