【问题标题】:setx setting PATH with spacessetx 用空格设置 PATH
【发布时间】:2012-06-16 04:31:34
【问题描述】:

我正在尝试更新 win32 shell 脚本中的系统路径变量,但前提是值不存在。

我当前的版本如下所示:

for %%f in (xyz.exe) DO if [%%~$PATH:f]==[]; setx Path "%PATH%;%GRADLE_HOME%\bin" -m

我遇到的问题是

setx Path "%PATH%;%GRADLE_HOME%\bin"  

这不起作用,但是如果我将引号更改为单引号

setx Path '%PATH%;%GRADLE_HOME%\bin'

它确实有效,但路径在第一次出现 Program Files 时结束。即 abc;def;程序

有什么办法可以克服吗?

【问题讨论】:

  • 请注意,写入本地系统的 setx 变量不会立即可用(如果您重新启动 cmd,它们是可用的)

标签: windows windows-shell setx


【解决方案1】:

其实有一个更简单的方法..它似乎工作,但它有点丑陋和不直观:

setx /M Path "%PATH%;%GRADLE_HOME%\bin

请注意,只有一个双引号,它在开头..如果你把一个放在末尾,它会在路径字符串中结束(开头没有那个)。

【讨论】:

  • 不适用于带有不可避免空格的路径,例如 `%PROGRAMFILES%\MySQL\MySQL Server 5.7\bin`
  • 这在 .bat 中有效:setx /m HERE "%~dp0(在 .bat 路径中有空格)
【解决方案2】:

我有点晚了,但我正在寻找类似的东西但找不到它,所以我自己想通了。我试图设置变量以从命令行启动 VSC#,并且 VSC# 的 exe 文件存在于包含与您的情况类似的空间的路径中。所以我的解决方案是使用以下设置变量:

setx vcs "\"E:\Program Files\IDE\vcsexpress.exe\"

【讨论】:

    【解决方案3】:

    单引号在 Windows 中永远不起作用。期间。

    实际上,您的代码确实适用于我的双引号。

    【讨论】:

    • 也许我应该补充一点,我在 Windows XP 上。该命令有效,但 PATH 中的某些值包含 Program Files 中的文件,因此在第一个 Program Files 中路径被截断。所以我的 PATH 中的最后一件事是 \Program
    【解决方案4】:

    我发现这个问题是因为我在寻找一些不同的东西。我需要在我设置的东西中加上引号。这并不是 OP 所要求的,但如果问题是嵌入引号,则可能与此有关。

    setx SVN_EDITOR C:\Program Files\vim\vim74\vim.exe
    

    我发现这虽然“正确”,但不起作用,因为该变量的用户被路径中的空格绊倒了,所以我需要在其中加上引号。

    我发现了

    set SVN_EDITOR="C:\Program Files\vim\vim74\vim.exe"
    

    工作得很好,所以我想我会尝试在 Windows 上转义引号的正常方法:

    setx SVN_EDITOR "^"C:\Program Files\vim\vim74\vim.exe^""
    

    但这不起作用,导致错误:

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

    所以我只是在控制面板中打开系统设置并在环境变量 GUI 中设置值。现在工作正常,我可以在命令行输入set svn,它会显示我需要的引用。

    如果您确实需要以编程方式设置环境变量,则需要自己查看注册表。这在 C 和 Python 中都非常简单(也可能在其他语言中)。不过,setx 似乎无法为您做到这一点。

    【讨论】:

      【解决方案5】:

      正确的格式是 setx var "\path1;\path\path2\" /M only 请注意,由于我的路径以斜杠结尾,因此最终结果是结束的 " 被转义并作为路径的一部分添加。

      如果您的路径以斜杠结尾...您必须转义最后一个反斜杠...更正后的版本是 setx var "\path1;\path\path2\\" /M

      需要引号来保护任何嵌入的空格..例如“程序文件”

      【讨论】:

        【解决方案6】:

        我放弃了直接使用 %PATH% 的尝试,因为它存在上述程序文件中的空格问题。

        我写了一个小命令将“Program Files”替换为“Progra~”,但很快我意识到这并不好,因为还有其他带有空格的路径。 Replace

        我找到了一个很好的 post 描述查询注册表。
        因此,作为测试,我设置了一个系统变量 AAA 并附加了路径和 gradle

        for /F "tokens=2* delims=   " %%f IN ('reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
        
        setx.exe AAA "%OLD_SYSTEM_PATH%%%GRADLE_HOME%%\bin;" -m
        

        希望对你有帮助

        【讨论】:

          【解决方案7】:

          我发现以下内容可以使用四个前导空格和三个尾随。一般windows会用另一个双引号转义一个双引号,所以尾部的双引号是有意义的,但是路径前面多出的双引号就有点奇怪了。

          setx VAR """"C:\path\to a file\with spaces\file.txt"""
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-08
            • 1970-01-01
            • 2015-04-02
            • 1970-01-01
            • 2014-07-30
            • 2013-07-27
            • 2018-04-02
            • 2013-10-21
            相关资源
            最近更新 更多