使用setx设置带有空格的PATH

6
我正在尝试在win32 shell脚本中更新系统Path变量,但仅在该值不存在时才更新。
我的当前版本大致如下:
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;Program。
有没有办法克服这个问题?

请注意,写入本地系统的 setx 变量不会立即生效(如果您重新启动 cmd,则可用)。 - msam
7个回答

10

实际上有一种更简单的方法..看起来它可以工作,但它有些丑陋和不直观:

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

请注意,这里只有一个双引号,而且它在开头..如果你把它放在结尾,它会出现在路径字符串中(没有在开头的那个)。


2
无法处理包含不可避免空格的路径,例如 %PROGRAMFILES%\MySQL\MySQL Server 5.7\bin\ - Jthorpe
这个在 .bat 文件中有效:setx /m HERE "%~dp0(.bat 路径中有空格) - Remi Arnaud

3

我有点晚了,但是我在寻找类似的东西时找不到,所以我自己想出来了。我正在尝试将变量设置为从命令行启动VSC#,并且VSC#的exe文件存在于一个类似于您情况的包含空格的路径中。所以对我来说,解决方案是使用以下方式设置变量:

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

2

在Windows中,单引号永远不起作用。就是这样。

实际上,使用双引号您的代码对我有效。


也许我应该补充说明一下,我正在使用Windows XP。该命令可以正常工作,但是PATH中的某些值包括Program Files中的文件,因此在第一个Program Files处路径就被截断了。因此,我的PATH中最后一件事是\Program。 - Shawn Vader

1
正确的格式是 setx var "\path1;\path\path2\" /M,需要注意的是,由于我的路径以斜杠结尾,因此闭合的双引号被转义并作为路径的一部分添加。
如果您的路径以斜杠结尾...您必须转义最后一个反斜杠...修正后的版本是 setx var "\path1;\path\path2\\" /M。
引号用于保护任何嵌入的空格,例如 "program files"。

1

我发现这个问题是因为我在寻找一些略微不同的东西。我需要将引号放入我正在设置的内容中。这并不完全是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无法为你完成这项任务。

0

我发现以下内容可以使用四个前导空格和三个尾随空格,通常情况下,Windows用另一个双引号来转义双引号,所以尾随的双引号是有意义的,但路径前面多出来的双引号有点奇怪。

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

0

我放弃了直接使用%PATH%,因为它存在与Program Files中的空格相关的问题。

我写了一个小命令来将"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

希望这能有所帮助


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