反斜杠与您的问题无关。您对变量的分配也没有问题。:-)
您的问题是&
字符 - 它是复合命令运算符,允许您在同一行输入中运行多个命令。您希望 the&
是文字,但是当您尝试 ECHO 时,它被视为运算符。例如,echo this&echo that
在屏幕上打印 2 行输出:“this”后跟“that”。
必须先解析批处理行,然后才能执行它。解析器必须识别命令和操作符。的扩展%texty%
发生在解析命令和运算符之前,因此解析器认为之后的下一个标记&
是命令。
有许多特殊字符会导致类似问题:|
>
<
)
&
^
.
有两种方法可以强制批处理解析器将特殊字符视为文字:1) 将其括在引号中,或 2) 将其转义为^
.
echo this&echo that
echo "this & that"
echo this ^& that
结果:
this
that
"this & that"
this & that
在您的 SET 语句中,您将整个赋值用引号括起来,因此它被正确地视为文字。您可以通过在设置分配后放置命令来向自己证明这一点set texty
- 它会将 texty 的当前值打印到屏幕上,您可以看到它是您想要的值。
但是当您回显该值时,它不再被引用,因此解析器将&
视为运算符并且您失败了。
你可以echo "%texty"
,但是你会在你的输出中得到引号。
您可以更改 texty 的定义以包含转义字符。
set "texty=\Music\TheArchive\Aeph ^& Neonlight\Aeph ^& Neonlight - Space Truckers - 7b - 173.26.mp3"
但这是一种痛苦。值得庆幸的是,有一个简单的解决方案 - 在解析命令和运算符之后发生变量的延迟扩展,因此您不再需要担心特殊字符。
必须先启用延迟扩展,然后才能使用setlocal enableDelayedExpansion
. 然后用感叹号而不是百分比将变量名括起来。
setlocal enableDelayedExpansion
set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo !texty! >>C:\Music\Playlists\baseplaylist.m3u
现在该行在!texty!
展开之前被解析为命令和运算符。所以 ECHO 正确地打印了 texty 的字面值。