使用 `^` 转义 Windows 批处理文件中的行尾字符在某些行上不起作用?

Using `^` to escape end-of-line character in a Windows Batch file doesn't work on certain lines?

我有一个批处理文件,我将它们放在一起以便通过单击自动启动一个程序和多个相关程序。问题相关部分:

echo Starting FireFox with Elite Tabset...
cd "C:\Program Files\Mozilla Firefox\"
start firefox.exe ^
https://inara.cz/cmdr/276665/ https://coriolis.io/ ^
https://www.edsm.net/ ^
http://www.elitedangeroustrading.com/trade-assistant.aspx ^
https://www.edtutorials.com/ ^
"file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Control packs/Singularity (Elite)/Singularity reference guide.pdf" "file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Companion packs/Ships assistant Ad-Astra/Ad-Astra reference guide.pdf" "file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/.Voice command lists/Elite Dangerous Voice Commands/Singularity ship commands.html" "file:///C:/Users/Guillermo/Downloads/ebonym-t16000mfcs.jpg"
echo Starting EDDiscovery...

如您所见,为了便于阅读,我使用 ^ 字符将 start firefox 命令分成多行。如图所示,该文件有效。但是,请注意倒数第二行,它以“file:///”开头。该行有多个参数。我试图做的是:

echo Starting FireFox with Elite Tabset...
cd "C:\Program Files\Mozilla Firefox\"
start firefox.exe ^
https://inara.cz/cmdr/276665/ https://coriolis.io/ ^
https://www.edsm.net/ ^
http://www.elitedangeroustrading.com/trade-assistant.aspx ^
https://www.edtutorials.com/ ^
"file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Control packs/Singularity (Elite)/Singularity reference guide.pdf" ^
"file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Companion packs/Ships assistant Ad-Astra/Ad-Astra reference guide.pdf" ^
"file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/.Voice command lists/Elite Dangerous Voice Commands/Singularity ship commands.html" ^
"file:///C:/Users/Guillermo/Downloads/ebonym-t16000mfcs.jpg"
echo Starting EDDiscovery...

当我这样做时,我得到以下输出:

C:\Program Files (x86)\VoiceAttack>echo Starting FireFox with Elite Tabset...
Starting FireFox with Elite Tabset...

C:\Program Files (x86)\VoiceAttack>cd "C:\Program Files\Mozilla Firefox\"

C:\Program Files\Mozilla Firefox>start firefox.exe https://inara.cz/cmdr/276665/ >https://coriolis.io/ https://www.edsm.net/ http://www.elitedangeroustrading.com/trade-assistant.aspx https://www.edtutorials.com/ "file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Control packs/Singularity (Elite)/Singularity reference guide.pdf" ^


C:\Program Files\Mozilla Firefox>"file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/Links and docs/Companion packs/Ships assistant Ad-Astra/Ad-Astra reference guide.pdf" "file:///C:/Program Files (x86)/VoiceAttack/Sounds/HCS Tools/.Voice command lists/Elite Dangerous Voice Commands/Singularity ship commands.html" ^
The filename, directory name, or volume label syntax is incorrect.

C:\Program Files\Mozilla Firefox>"file:///C:/Users/Guillermo/Downloads/ebonym-t16000mfcs.jpg"
The filename, directory name, or volume label syntax is incorrect.

C:\Program Files\Mozilla Firefox>echo Starting EDDiscovery... 
Starting EDDiscovery...

我不明白为什么我能够将前 4 个参数分开,但不能将以 "file:// 开头的参数分开。 ^ 是否有我遗漏或误用的一些微妙方面?这种清理有不同的技术吗?我承认这纯粹是一个可读性问题,但无法解释这种行为令人烦恼。

问题在于以双引号开头的行,因为行尾的插入符会转义行尾和下一行的第一个字符。
这导致转义第一个引号,而行尾的“结束”引号被解释为“开始”引号。

这可以通过简单地在每行前面加上 space.

来解决
start firefox.exe ^
https://www.edsm.net/ ^
https://www.edtutorials.com/ ^
 "file:///C:/Program Files/guide.pdf" ^
 "file:///C:/Program Files/blapdf" ^
...

对于这个问题,存在第二种更晦涩的解决方案,即在插入符号前添加重定向。
使用这种方法,下一行的第一个字符按预期工作(不会被转义)

start firefox.exe ^
https://www.edsm.net/ <nul ^
https://www.edtutorials.com/ <nul ^
"file:///C:/Program Files/guide.pdf" <nul ^
"file:///C:/Program Files/blapdf" <nul ^
...

更多信息在 SO:Long commands split over multiple lines..