我希望bat文件采用此文本\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3
并将其写入现有文本文件中的新行baseplaylist.m3u
到目前为止我有这个:
set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo %texty% >>C:\Music\Playlists\baseplaylist.m3u
但它不起作用。我知道问题是由于我试图复制的文本中的字符,但我不知道如何克服这个问题。
问题是运算符&,在这种情况下,您将需要扩展变量或scape运算符或用另一个双引号括起“echo”字符串......但在您的情况下解决方案是如此简单:
set "texty=\Music\TheArchive\Aeph & Neonlight\Aeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
<nul Set /P "string=%TEXTY%" >>C:\Music\Playlists\baseplaylist.m3u
PS:使用SETLOCAL ENABLEDELAYEDEXPANSION是一个不好的做法,当你玩文件名时(特别是当它们包含角色!)所以尽量不要使用扩展,所有都可以在不扩展变量(ALL)的情况下完成,启用delayedexpansion是容易和坏的完成最重要事情的方法,但不是唯一的方法。
我希望这对你有所帮助。
反斜杠与您的问题无关。您对变量的赋值也没有问题。 :-)
你的问题是&
字符 - 它是复合命令操作符,允许你在同一行输入上运行多个命令。你希望&
是一个文字,但当你尝试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"
,但那么你会得到你的输出报价。
您可以更改文本的定义以包含转义字符。
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的字面值。