由命令
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 命令行选项。
set variable="value"
而不是set "variable=value"
。参见例如为什么在命令行上使用“set var = text”后,“echo%var%”没有字符串输出?,以了解在__SET__命令所在行中第一个引号指定位置的区别的解释。 - Mofiset "variable=value"
不会将引号包含在值中,因此您只需要在扩展(读取)值时像"%variable%"
一样关注它们,因此任何代码在引号方面变得更加一致... - aschipfl