有一个程序可以解析 QB64 中的命令行。COMMAND$ 函数返回命令行。我需要解析一个可能包含空格的长文件名,方法是从引号内解析它以不同于没有空格的文件名。例如,“长文件名.ext”
问题是,当命令行没有引号时,command$返回文件名,在引号中时,相同,例如“文件名”和“文件名”都返回文件名。但是, """filename""" 返回带引号的文件名......还有另一种方法可以将引号发送到 command$ 吗?
QB64 提供了COMMAND$
和_COMMANDCOUNT
功能——主要类似于C++ 中的argv
和argc
。COMMAND$
不带参数将返回包含所有命令行参数的单个字符串,但 QB64 还允许COMMAND$(i)
将索引处的参数i
作为字符串检索。QB64 Wiki 上的_COMMANDCOUNT
条目示例:
limit = _COMMANDCOUNT
FOR i = 1 TO limit
PRINT COMMAND$(i)
NEXT
您将使用它们来处理 QB64 中的命令行参数。如果要将包含引号的命令行参数传递给程序,则可能需要使用反斜杠转义要保留的引号。
不幸的是,反斜杠转义并不是万无一失的,特别是可能会导致麻烦cmd.exe
,主要是因为在文件路径中使用了反斜杠。将它与文件路径中的空格结合起来,你就有了一个噩梦般的命令解释器。从这个答案中,您可以将带引号的字符串中的引号加倍,以将正确的引号传递给程序:
> 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 参数的正确 Windows 表示形式'C:/Program Files/"file" name'
作为单个参数传递给程序:
> 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 运行时的引用规则和反斜杠转义。