Тройные кавычки требуются в командной строке в 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 и обратная косая черта.

Другие вопросы по тегам