Как анализировать командную строку так же, как это делает VBScript - PullRequest
0 голосов
/ 19 января 2019

У меня есть простая программа на C ++, в которой перечислены аргументы, которые она получает:

#include <iostream>

int main(int argc, char* argv[]) {
    for (int i = 1; i < argc; i++) {
        std::cout << argv[i] << std::endl;
    }
    return 0;
}

Я просто проверяю / выясняю это, но в конечном итоге мы намерены принять имена некоторых файлов и каталогов.

Итак, я передаю следующие аргументы:

"\\server\directory\file.ext" "C:\trailing\backslash\" "file.txt"

Но вот что напечатано:

\\server\directory\file.ext 
C:\trailing\backslash" file.txt

т.е. косая черта на втором аргументе заставляет его думать, что закрывающая кавычка экранирована.

Я устанавливаю аргументы на страницах свойств VS2017, но я получаю тот же вывод, когда:

  • Я вызываю exe из PowerShell.
  • Я разрешаю внешнему инструменту пройти exe аргументы, которые он построил (который будет, как это в конечном итоге б).

Как я могу заставить мою программу понять, что путь в кавычках с косой чертой - это один аргумент?

EDIT Раздел 4 этой статьи точно описывает мою проблему. По сути, я хочу, чтобы моя программа на C ++ интерпретировала аргументы так же, как это делает пакетный файл или VBScript. Я не могу изменить способ ввода аргументов в мою программу

РЕДАКТИРОВАТЬ Я упросту вопрос:

Программа на C ++, приведенная выше, ведет себя так: The C++ program above behaves like this

Я хочу, чтобы он вел себя так: I want it to behave like this

Что я должен сделать с программой или компилятором, чтобы это произошло?

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы должны защитить обратную косую черту с помощью другой обратной косой черты, в противном случае обратная косая черта рассматривается как символ перехода для следующей двойной кавычки.См. сообщение в блоге Раймонда Чена для обоснования такого поведения.Вот цитата соответствующей части:

  • Строка обратных косых черт, за которой не следует кавычка, не имеет особого значения.
  • Четное число обратных косых черт, за которыми следуеткавычка обрабатывается как пары защищенных обратных косых черт, за которыми следует слово-терминатор.
  • Нечетное число обратных косых черт, за которым следует кавычка, обрабатывается как пары защищенных обратных косых черт, за которыми следует защищенная кавычка.
0 голосов
/ 21 января 2019

Если вас не устраивает разбор командной строки, вы можете сделать это самостоятельно:

Просто используйте GetCommandLine и анализируйте командную строку так, как вы этого хотите.

В другом посте уже описывалось, как обрабатывать / обрабатывать командную строку (см. сообщение в блоге Рэймонда Чена ).

0 голосов
/ 19 января 2019

Я попытался скомпилировать это с дополнительной косой чертой ко второму аргументу, как показано ниже, и смог получить желаемый результат!

"\\server\directory\file.ext" "C:\trailing\backslash\\" "file.txt"

Это был вывод

/home/a.out                                                                                                                          
\server\directory\file.ext                                                                                                           
C:\trailing\backslash\                                                                                                               
file.txt 

Подпишитесь на мой пост, если он вам поможет: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...