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

@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上。

评论

%srijani%和%value%变量的值是什么。

经常犯的标准错误是使用set variable =“ value”而不是set“ variable = value”。例如,请参阅为什么在命令行上使用“ set var = text”后为什么没有带有“ echo%var%”的字符串输出?有关使用命令SET在行上指定第一引号的区别的说明。

@Mofi-实际上就是答案...

Mofi建议的一个很大的优点是,设置“ variable = value”时,该值中不包含周围的引号,因此,仅当扩展(读取)“%variable%”之类的值时,才需要关心它们。在报价方面变得更加一致...

#1 楼

setx命令输出的错误是由于将字符串分配给变量value时引号使用不正确引起的。

已设置命令,参数为variable=value。对于大多数命令和应用程序,如果包含一个或多个空格或此列表中的任何其他字符,则可能且经常需要用双引号将参数引起来:&()[]{}^=;!'+,`~。通过在命令提示符窗口cmd /?help cmd中运行,这些字符会显示在最后的帮助页面上。

但是这里有错误:

set value="Hello world"


用等号后的第一个双引号将命令集的整个参数variable=value括在双引号中。

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

扩展行时
/>
setx -M srijani "%srijani%;%value%"


因此结果是:

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


命令setx将错误引用的参数解释为语法错误。 br />
更正将使用:

set "value=Hello world"


现在命令集的整个参数都用双引号引起来。因此,在解析该行时会忽略以下内容:


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

因此,仅将Hello world分配给名称为value的变量。

有关正确的更多详细信息将字符串分配给环境变量,请阅读以下答案:为什么在命令行上使用“ set var = text”后,没有显示“ echo%var%”的字符串?它还包含一个简单的演示批处理代码。

更多信息:

如何解释在中间某处包含1个或多个引号的参数字符串取决于命令和相应的应用程序。解释在参数字符串中包含1个或多个"的参数的行为可能会因所使用的编译器而异,如批处理文件中的答案所述:在特定文件夹中列出rar文件并将结果写入文本文件,当然,命令/应用程序。

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

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%"作为具有在资源管理器窗口中显示的路径的目录的名称。

另请参阅SS64-Windows资源管理器命令行选项。

#2 楼

setx foo“ \”此环境变量的两端都有空格和双引号\“”