Как создать консольное приложение, которое выполняет команду только при вызове - PullRequest
0 голосов
/ 17 января 2020

Я работаю над проектом, который имеет некоторую функциональность, похожую на диспетчер задач windows, но как консольное приложение. До сих пор мне удалось создать в приложении меню и, по выбору пользователя, приложение запускает определенные функции c.

Теперь я подумываю о том, чтобы приложение могло выполнять какую-либо функцию, например, с помощью команд, скажем, у нас есть команда close -all. Это должно закрыть все открытые windows.

На самом деле, у меня есть некоторая информация о том, как я могу обработать команду и вызвать соответствующую функцию, я думаю, используя лексер для получения токенов, а затем использую парсер для вызова функций, пожалуйста, исправьте меня, если я ошибается.

Однако я могу использовать команды, только если мое приложение работает в cmd. я хочу в любой момент вызвать команду типа wg close all (wg - имя приложения), а затем, возможно, продолжить выполнение других команд cmd, например mkdir или cd.

1 Ответ

0 голосов
/ 25 апреля 2020

Похоже, вам нужна базовая c функциональность программы на C ++, предоставляемой методом main(int argc, char* argv[]) (при необходимости обратитесь к этой документации: https://en.cppreference.com/w/cpp/language/main_function).

С argc - количество аргументов и argv - массив со значениями аргументов. Я предполагаю, что ваше приложение создает GUI с Qt или некоторой библиотекой, которую вам не нужно запускать, если запустить в пакетном режиме.

В зависимости от сложности аргументов, которые вам нужно обработать, вы может разобраться с очень простой c структурой для анализа аргументов.

Пример псевдокода


main(argc, argv) {

  if (argc == 0) {
    startProgramInNormalGUIMode();
    exit(0);
  }

  // This could be a sub method "parse(argc, argv)"

  String parameter="";
  Boolean executed=false;

  for (i=0; i < argc; ++i) {

    if element == "close" {
      set parameter = argv[i+1];
      i++;  // skip next element which was the parameter

      // myCloseOperation would check if parameter is 
      // "all" for example and closes all windows
      // or treat any other value as window title for 
      // example and closes only the matching window.
      myCloseOperation(parameter);
      set executed = true;
    }

    if element == "operation2" {
      set parameter = argv[i+1];
      i++;

      myOperation2Method(parameter);
      set executed = true;
    }
  }

  if (executed == false) {
    showSyntaxErrorMessage();
    exit(1);
  }

  exit(0);

}

Приведенный выше псевдокод предполагает, что каждая операция имеет идентифицирующее имя и только один параметр, следующий за ним. Вы можете изменить код так, чтобы он также допускал нулевые параметры или более одного и соответственно изменял приращение i.

Вы также можете добавить проверку, если строка параметра или операции начинается с da sh или sla sh или какого-либо другого префикса, который вы хотите.

Также предполагается, что операция и ее параметры могут встречаться в командной строке более одного раза, и каждый случай будет выполнен. Например, wg close aWindowTitle close anotherWindowTitle close all будет проанализирован как действительный, и будут выполнены три операции закрытия.

...