我正在尝试更新 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'
它确实有效,但路径在程序文件第一次出现时结束。即 abc;def;程序
有什么办法可以克服这个问题吗?
实际上有一种更简单的方法......它似乎有效,但它有点丑陋且不直观:
setx /M Path "%PATH%;%GRADLE_HOME%bin
请注意,只有一个双引号,它位于开头.. 如果将一个放在末尾,它将以路径字符串结束(开头没有那个)。
晚了,但我正在寻找类似的东西,但找不到它,所以我自己想通了。我试图设置变量以从命令行启动 VSC#,并且 VSC# 的 exe 文件存在于包含类似于您的情况的路径空间中。所以我的解决方案是使用以下方法设置变量:
setx vcs ""E:Program FilesIDEvcsexpress.exe"
单引号在 Windows 中永远不起作用。时期。
实际上,您的代码确实可以使用双引号对我有用。
我找到这个问题是因为我正在寻找一些不同的东西。我需要在我设置的东西中加上引号。这并不完全是 OP 所询问的内容,但如果问题是嵌入引号,则可能与此相关。
setx SVN_EDITOR C:Program Filesvimvim74vim.exe
我发现这虽然"正确",但不起作用,因为此变量的用户被路径中的空格绊倒,所以我需要在那里加上引号。
我发现
set SVN_EDITOR="C:Program Filesvimvim74vim.exe"
工作得很好,所以我想我会尝试在 Windows 上转义引号的正常方法:
setx SVN_EDITOR "^"C:Program Filesvimvim74vim.exe^""
但这不起作用,导致错误:
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.
所以我只是在控制面板中打开系统设置并在环境变量 GUI 中设置值。现在工作正常,我可以在命令行中键入set svn
,它会根据需要显示引用。
如果你真的需要以编程方式设置你的环境变量,你需要自己看看敲打注册表。这在C和Python中都非常简单(可能在其他语言中也是如此)。不过,setx
似乎不能为你做到这一点。
正确的格式是 setx var "\path1;\path\path2\"/M 请注意,由于我的路径以斜杠结尾,因此净效果是关闭 " 被转义并作为路径的一部分添加。
如果您的路径以斜杠结尾...你必须转义最后一个反斜杠...然后更正后的版本是 setx var "\path1;\path\path2\\"/M
需要引号来保护任何嵌入的空格..例如"程序文件"
我放弃了尝试直接使用 %PATH%,因为这在程序文件中的空格中存在上述问题。
我写了一个小命令将"程序文件"替换为"Progra~",但很快我意识到这不好,因为还有其他带有空格的路径。取代
我找到了一篇描述查询注册表的好帖子。
因此,作为测试,我设置了一个系统变量 AAA,并附加了路径和 gradle
for /F "tokens=2* delims= " %%f IN ('reg query "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment" /v Path ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx.exe AAA "%OLD_SYSTEM_PATH%%%GRADLE_HOME%%bin;" -m
希望这有帮助
我发现以下内容适用于四个前导空格和三个尾随空格。通常,Windows 会使用另一个双引号转义双引号,因此尾随双引号是有意义的,但路径前面的额外双引号有点奇怪。
setx VAR """"C:pathto a filewith spacesfile.txt"""