QB64中命令行需要三重引号

时间:2017-11-15 05:39:54

标签: basic qbasic qb64

有一个程序在QB64中解析命令行。 COMMAND $函数 返回命令行。我需要解析一个可能包含的长文件名 通过从引号内解析它与不具有的文件名不同的空格 空间。例如,“long filename.ext”

问题是,当命令行没有引号时,命令$返回 文件名,当在引号中时,相同,例如“filename”和“”filename“”都返回文件名。但是,“”“filename”“”返回 带引号的文件名...是否有另一种方法可以发送报价命令$ ??

1 个答案:

答案 0 :(得分:1)

QB64提供COMMAND$_COMMANDCOUNT函数 - 大部分类似于C ++中的argvargc。不带参数的COMMAND$将返回包含所有命令行参数的单个字符串,但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

修改

您可以在引用的字符串之外使用^",但由于""^"会产生",因此会产生""",就像""^"一样。将""^^"传递给批处理文件需要额外转义为^。因此,建议不要使用"",尤其是当"""^同样有效时。有关'C:/Program Files/"file" name'转义字符的信息,请参阅我上面链接的答案。

您还应该小心使用反斜杠和引用的字符串。考虑如何将类似Unix的参数> program.exe "C:\Program Files\\""file\"" name" C:\Program Files\"file" name 的正确Windows表示作为一个参数传递给您的程序:

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的命令行传递给程序,然后导致cmd.exe的路径。当然,这样的路径在Windows中是不可能的(在NTFS文件系统上根本不可能?),但它说明了一点:你需要考虑edu_less(high_school, bachelor). edu_less(bachelor, masters). edu_less(masters, phd). edu_lessOrEqual(X,X). edu_lessOrEqual(X, Y):- edu_less(X,Y). edu_lessOrEqual(X, Y):- edu_less(X,Z), edu_lessOrEqual(Z,Y). 的引用规则和C运行时的引用规则和反斜杠逃脱。