如何设置带有空格的环境变量?

19

我需要使用批处理文件将值设置为环境变量。我编写了以下脚本:

@echo off
set value="Hello world"
setx -M srijani "%srijani%;%value%"

它会显示错误:

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

我谷歌搜索并发现,在使用空格时,我们需要将其写在双引号内。

set value="Hello world"

但是,那也不起作用。

注意:我使用的是Windows 7操作系统。


12
经常犯的标准错误是使用set variable="value"而不是set "variable=value"。参见例如为什么在命令行上使用“set var = text”后,“echo%var%”没有字符串输出?,以了解在__SET__命令所在行中第一个引号指定位置的区别的解释。 - Mofi
@Mofi - 实际上那就是答案... - npocmaka
2
Mofi的建议有一个很大的优点,即set "variable=value"不会将引号包含在值中,因此您只需要在扩展(读取)值时像"%variable%"一样关注它们,因此任何代码在引号方面变得更加一致... - aschipfl
2个回答

21
由命令setx输出的错误是由于在向变量value赋值时引号使用不正确引起的。
该命令是set,参数是variable=value。对于大多数命令和应用程序,如果参数中包含一个或多个空格或列表中的任何其他字符: &()[]{}^=;!'+,`~,则通常需要用双引号括起来。可以通过在命令提示窗口中运行cmd /?help cmd来查看这些字符,它们会显示在最后一页帮助页面的输出中。
但这里使用了错误的引号:
set value="Hello world"

在等号后的第一个双引号之前,命令set的整个参数variable=value并未用双引号括起来。

这将把双引号解释为要分配给名称为value的变量的字符串的一部分。从等号到行尾的所有内容(包括双引号和可能存在的尾随空格和水平制表符)都会被分配给变量value,而不仅仅是预期的字符串Hello world

在扩展该行时

setx -M srijani "%srijani%;%value%"

结果因此为:

setx -M srijani "Value of variable srijani;"Hello world""

命令setx会将错误引用的参数解释为语法错误。

正确的做法是使用:

set "value=Hello world"

现在 set 命令的整个参数被包括在双引号中,因此以下内容在解析该行时将被忽略:

  • set 命令和第一个双引号之间的所有空格/制表符,
  • 第一个双引号,
  • 最后一个双引号,
  • 以及最后一个双引号之后可能存在的所有空格/制表符。

所以只有 Hello world 被分配给名称为 value 的变量。

有关将字符串正确分配给环境变量的更多详细信息,请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案。它还包含一个简单的演示批处理代码。

更多信息:

如何解释一个包含一个或多个引号的参数字符串取决于命令或应用程序。有关在参数字符串中解释带有 1 个或多个 " 的参数的行为可以因使用的编译器而异,如batch file: list rar file in specific folder and write result into text file 上的答案所解释的那样,并且当然也取决于命令/应用程序的源代码。

对于大多数命令和应用程序,正确的语法是:

command "parameter in quotes"
"Path to application\app.exe" "parameter in quotes" 

但有些应用程序需要在参数字符串的中间使用引号。这样的应用程序示例是Windows浏览器

以下语法是打开一个资源管理器窗口,其中当前目录显示在窗口中,可以在批处理文件中使用。

explorer.exe /e,"%CD%"

无法工作的包括:

explorer.exe "/e,%CD%"
explorer.exe /e "%CD%"

因此,explorer.exe 要求在 /e, 后指定要打开的目录,并在参数字符串中间加上引号,否则它将分别将 "/e,%CD%""/e %CD%" 解释为要在 Explorer 窗口中显示的带有路径的目录名称。

另请参见 SS64 - Windows Explorer 命令行选项


2

我希望你能够翻译这段内容:setx foo "\"这个环境变量两端都有空格和双引号\""


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