写入包含反斜杠的文本字符串会导致变量赋值问题



我希望bat文件将此文本MusicTheArchiveAeph & NeonlightAeph & Neonlight - Space Truckers - 7b - 173.26.mp3写入现有文本文件baseplaylist.m3u中的新行

到目前为止,我有这个:

set "texty=MusicTheArchiveAeph & NeonlightAeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo %texty% >>C:MusicPlaylistsbaseplaylist.m3u

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

Backslash与您的问题无关。变量的赋值也没有问题。:-)

您的问题是&字符——它是一个复合命令运算符,允许您在同一行输入上运行多个命令。您希望&是一个文字,但当您尝试ECHO它时,它被视为一个运算符。例如,echo this&echo that向屏幕打印两行输出:"this"one_answers"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=MusicTheArchiveAeph ^& NeonlightAeph ^& Neonlight - Space Truckers - 7b - 173.26.mp3"

但这是一种痛苦。值得庆幸的是,有一个简单的解决方案——在解析命令和运算符后,变量会延迟扩展,因此您不再需要担心特殊字符。

在使用setlocal enableDelayedExpansion之前,必须启用延迟扩展。然后用感叹号而不是百分比将变量名括起来。

setlocal enableDelayedExpansion
set "texty=MusicTheArchiveAeph & NeonlightAeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
echo !texty! >>C:MusicPlaylistsbaseplaylist.m3u

现在,在展开!texty!之前,将解析该行中的命令和运算符。所以ECHO正确地打印了texty的字面值。

问题在于运算符&,在这种情况下,您需要展开变量或对运算符进行scape处理,或者用另一个双引号将"echo"字符串括起来。。。但在您的情况下,解决方案非常简单:

set "texty=MusicTheArchiveAeph & NeonlightAeph & Neonlight - Space Truckers - 7b - 173.26.mp3"
<nul Set /P "string=%TEXTY%" >>C:MusicPlaylistsbaseplaylist.m3u

PS:使用SETLOCAL ENABLEDELAYEDEXPANSION在处理文件名时是一种不好的做法(尤其是当文件名包含字符时),所以尽量不要使用扩展,所有操作都可以在不扩展vars(all)的情况下完成,启用delayedexansion是完成大部分任务的简单而糟糕的方法,但不是唯一的方法。

我希望这对你有所帮助。

最新更新