编写包含反斜杠的文本字符串,分配变量的问题

时间:2012-12-08 12:41:33

标签: windows batch-file cmd

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

问题在于操作员&amp; ,在这种情况下,您需要扩展变量或操作运算符或封闭&#34; echo&#34;带有另一个双引号的字符串......但是你的案例中的解决方案很简单:

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成为完成最重要事情的简单和糟糕方式,但不是唯一的方法。

我希望这对你有所帮助。