2

我希望 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

但它不起作用。我知道问题是由于我试图复制的文本中的字符造成的,但我不知道如何克服这个问题。

4

2 回答 2

3

反斜杠与您的问题无关。您对变量的分配也没有问题。:-)

您的问题是&字符 - 它是复合命令运算符,允许您在同一行输入中运行多个命令。您希望 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 的字面值。

于 2012-12-08T17:10:11.317 回答
0

问题是运算符&,在这种情况下,您将需要扩展变量或转义运算符或用另一个双引号将“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是一个不好的做法,当你在玩文件名时(尤其是当它们包含字符时)所以尽量不要使用扩展,所有都可以在不扩展 vars (ALL) 的情况下完成,启用延迟扩展是容易和坏的做最多事情的方法,但不是唯一的方法。

我希望这对你有所帮助。

于 2012-12-08T20:50:00.867 回答