当只有两个参数时,使用“setx”出现超过两个参数的无效语法问题。

10
我在使用SETX命令永久地设置全局环境变量PATH时遇到了困难。
我已经阅读了类似问题的答案,如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。(这需要管理员访问权限)
3个回答

12
 echo %PATH%

如果您的(机器级别)%path% 以反斜杠 (backslash) 结尾,您应该将其加倍,如下所示:
if "%path:~-1%"=="\" (
   SETX PATH "%PATH%\"
) else (
   SETX PATH "%PATH%"
)

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

一些命令(例如REGFINDSTR)使用标准的转义字符\(与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错误与用户级别的%PATH%变量损坏有关,这是由于首次使用SETX PATH "%PATH%"作为用户级别环境变量优先于机器级别环境变量所导致的。要解决此问题,首先要调整用户级别的%PATH%变量(或完全删除它)通过Windows GUI(首选)

控制面板 | 系统 | 高级 | 环境变量

证明 - 重现问题需要两步:

第一步:从机器级别的良好%myPath%变量开始,以\结尾;最后(在最终阶段)破坏了当前用户级别的该变量,并退出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"

==>

实际上,我确定它以 ; 结尾,如果不是的话,就以文件夹名称的结尾为准,但绝对不是以 \ 结尾。此外,在撰写本文时,用户级别上不存在 PATH 变量。 - octopod

3
以下方法对我有效:
步骤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%

0

这意味着它已经在路径中了(我已经与setx斗争了几天,它很愚蠢)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接