有一个在QB64中解析命令行的程序。命令$函数返回命令行。我需要解析一个长文件名,这个文件名可能包含一个空格,方法是从引号中解析一个空格,以区别于没有空格的文件名。例如,"long filename.ext“
问题是,当命令行没有引号时,命令$返回文件名,如果在引号中,则相同,例如," filename“和”filename“都返回文件名。但是,“文件名”返回带有引号的文件名.还有另一种方式来发送报价命令$吗?
发布于 2017-11-18 04:18:31
QB64提供了COMMAND$和_COMMANDCOUNT函数--主要类似于C++中的argv和argc。没有参数的COMMAND$将返回一个包含所有命令行args的字符串,但QB64还允许COMMAND$(i)以字符串的形式检索索引i处的参数。 entry上的QB64 Wiki示例:
limit = _COMMANDCOUNT
FOR i = 1 TO limit
PRINT COMMAND$(i)
NEXT您可以使用它们来处理QB64中的命令行参数。如果您想将包含引号的命令行args传递给程序,则可能需要使用反斜杠来转义所需的引号。
不幸的是,反斜杠转义并非万无一失,特别是在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在葡萄酒的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" namecmd.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运行时的引用规则以及反斜杠转义。
https://stackoverflow.com/questions/47300144
复制相似问题