Тройные кавычки требуются в командной строке в QB64
Есть программа, которая анализирует командную строку в QB64. Функция COMMAND$ возвращает командную строку. Мне нужно проанализировать длинное имя файла, которое может содержать пробел, анализируя его из кавычек, чтобы отличаться от имени файла без пробела. Например, "long filename.ext"
Проблема в том, что когда в командной строке нет кавычек, команда $ возвращает имя файла, а в кавычках одинаковые, например, "имя файла" и "имя файла", оба возвращают имя файла. Однако "" "filename" "" возвращает имя файла с кавычками... Есть ли другой способ отправить кавычку команде $??
1 ответ
QB64 обеспечивает COMMAND$
а также _COMMANDCOUNT
функции - в основном аналогичные argv
а также argc
в C++. COMMAND$
без аргументов вернет одну строку, содержащую все аргументы командной строки, но QB64 также позволяет COMMAND$(i)
получить аргумент по индексу i
как строка Пример из _COMMANDCOUNT
запись в QB64 Wiki:
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
В вине 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
редактировать
Ты можешь использовать ^"
за пределами строки в кавычках, но это имеет свои проблемы, как ""^"
результаты в "
например, так же, как """
, Переходя ""^"
к пакетному файлу требуется дополнительный побег, как ""^^"
, С помощью ^
поэтому не рекомендуется, особенно когда ""
а также """
работать так же хорошо. См. Ответ я связал выше для информации о ^
побег персонажа.
Вы также должны быть осторожны с обратными слешами и кавычками. Подумайте, как вы можете передать правильное представление в Windows Unix-подобного аргумента '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 и обратная косая черта.