QB64 中的命令行需要三重引号

Triple quotes required on command line in QB64

有一个解析QB64命令行的程序。命令 $ 函数 returns 命令行。我需要解析一个可能包含的长文件名 a space 通过从引号内解析它来区别于没有的文件名 space。例如,"long filename.ext"

问题是,当命令行没有引号时,命令$ returns 文件名,当在引号中时,相同,例如 "filename" 和“"filename"”都是 return 文件名。然而,“"filename"”“return是 带引号的文件名...还有另一种方法可以将引号发送到 command$??

QB64 提供了 COMMAND$_COMMANDCOUNT 函数——主要类似于 C++ 中的 argvargcCOMMAND$ 没有参数将 return 包含所有命令行参数的单个字符串,但 QB64 还允许 COMMAND$(i) 检索索引 i 处的参数作为字符串。来自 QB64 Wiki 上 _COMMANDCOUNT entry 的示例:

limit = _COMMANDCOUNT
FOR i = 1 TO limit
    PRINT COMMAND$(i)
NEXT

您将使用它们来处理 QB64 中的命令行参数。如果您想将包含引号的命令行参数传递给程序,您可能需要使用反斜杠转义您想要保留的引号。

不幸的是,反斜杠转义并非万无一失,可能会导致 cmd.exe 出现问题,主要是因为文件路径中使用了反斜杠。将它与文件路径中的空格结合起来,你就有了一个噩梦般的命令解释器。从 this answer 开始,您将带引号的字符串中的引号加倍,以将正确的引号传递给程序:

> program.exe hello world
hello
world

> program.exe hello"" world
hello (+ empty quoted string)
world

> program.exe "hello"" world
hello"
world

> program.exe "hello""" world
hello" world

在 Wine 的 cmd.exe 中,"" 转义引号也关闭了引号字符串,如上所示,因此需要一个紧接的连续引号来继续将下一个间隔项目与当前参数分组。我不确定 Windows 的实现,因为我不是 运行 一台 Windows 机器,但在我看来可能会发生相同的行为。

换句话说,你通过了 """filename""" 因为:

"        Open quoted string
""       Escaped double quote, closes quoted string
filename Concatenated at the end of the first quoted string
"        Open quoted string, concatenated to filename
""       Escaped double quote, closes quoted string

编辑

您可以在带引号的字符串之外使用 ^",但是这有其自身的问题,例如 ""^" 会导致 ",就像 """ 一样。将 ""^" 传递给批处理文件需要额外转义为 ""^^"。因此,不推荐使用 ^,尤其是当 """"" 工作正常时。有关 ^ 转义字符的信息,请参见我上面链接的答案。

您还应注意反斜杠和带引号的字符串。考虑如何将类 Unix 参数 'C:/Program Files/"file" name' 的正确 Windows 表示形式作为单个参数传递给您的程序:

> program.exe "C:\Program Files\""file\"" name"
C:\Program Files\"file" name

cmd.exe 解释:

"                   Open quoted string
C:\Program Files\  Quoted string contents, including escaped \
""                  Escaped double quote, closes quoted string
file\               Unquoted string contents, including C escape char
""                  Open quoted string with escaped double quote
[ ]name             Quoted string contents
"                   Close quoted string

这导致命令行 "C:\Program Files\"file\" name" 被传递给程序,然后导致路径 C:\Program Files\"file" name。当然,这样的路径在 Windows 中是不可能的(也许在 NTFS 文件系统上根本不可能?),但它说明了这一点:你需要考虑到 cmd.exe 的引用规则和C 运行时的引用规则和反斜杠转义。