«Расширенное» консольное приложение - PullRequest
10 голосов
/ 05 января 2011

Я не уверен, что был дан ответ на этот вопрос в другом месте, и я не могу найти что-то через Google, который не является примером "Hello World" ... Я пишу в C # .NET 4.0.

Я пытаюсь разработать консольное приложение, которое будет открывать, отображать текст, а затем ждать, пока пользователь введет команды, где команды будут выполнять определенную бизнес-логику.

Например: если пользователь открывает приложение и вводит «help», я хочу отобразить несколько операторов и т. Д. И т. Д. Я не уверен, как закодировать «обработчик событий» для ввода данных пользователем.

Надеюсь, это имеет смысл.Любая помощь приветствуется!Приветствия.

Ответы [ 7 ]

21 голосов
/ 05 января 2011

Вам нужно несколько шагов, чтобы достичь этого, но это не должно быть так сложно. Сначала вам нужен какой-то парсер, который разбирает то, что вы пишете. Чтобы прочитать каждую команду, просто используйте var command = Console.ReadLine(), а затем проанализируйте эту строку. И выполнить команду ... Основная логика должна иметь базу, выглядящую так (вроде):

public static void Main(string[] args)
{
    var exit = false;
    while(exit == false)
    {
         Console.WriteLine();
         Console.WriteLine("Enter command (help to display help): "); 
         var command = Parser.Parse(Console.ReadLine());
         exit = command.Execute();
    }
}

В некотором смысле, вы могли бы изменить это, чтобы сделать его более сложным.

Код для Parser и команды довольно прост:

public interface ICommand
{
    bool Execute();
}

public class ExitCommand : ICommand
{
    public bool Execute()
    {
         return true;
    }
}

public static Class Parser
{
    public static ICommand Parse(string commandString) { 
         // Parse your string and create Command object
         var commandParts = commandString.Split(' ').ToList();
         var commandName = commandParts[0];
         var args = commandParts.Skip(1).ToList(); // the arguments is after the command
         switch(commandName)
         {
             // Create command based on CommandName (and maybe arguments)
             case "exit": return new ExitCommand();
               .
               .
               .
               .
         }
    }
}
1 голос
/ 15 марта 2017

Я знаю, что это старый вопрос, но я тоже искал ответ. Я не смог найти простой, поэтому я построил InteractivePrompt. Он доступен в виде пакета NuGet , и вы можете легко расширить код на GitHub . Он также имеет историю для текущего сеанса.

Функциональность в вопросе может быть реализована таким образом с InteractivePrompt:

static string Help(string strCmd)
{
    // ... logic
    return "Help text";
}
static string OtherMethod(string strCmd)
{
    // ... more logic
    return "Other method";
}
static void Main(string[] args)
{
    var prompt = "> ";
    var startupMsg = "BizLogic Interpreter";
    InteractivePrompt.Run(
        ((strCmd, listCmd) =>
        {
            string result;
            switch (strCmd.ToLower())
            {
                case "help":
                    result = Help(strCmd);
                    break;
                case "othermethod":
                    result = OtherMethod(strCmd);
                    break;
                default:
                    result = "I'm sorry, I don't recognize that command.";
                    break;
            }

            return result + Environment.NewLine;
        }), prompt, startupMsg);
}
0 голосов
/ 05 января 2011

образец:

    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to test console app, type help to get some help!");

        while (true)
        {
            string input = Console.ReadLine();

            int commandEndIndex = input.IndexOf(' ');

            string command = string.Empty;
            string commandParameters = string.Empty;

            if (commandEndIndex > -1)
            {
                command = input.Substring(0, commandEndIndex);
                commandParameters = input.Substring(commandEndIndex + 1, input.Length - commandEndIndex - 1);
            }
            else
            {
                command = input;
            }

            command = command.ToUpper();

            switch (command)
            {
                case "EXIT":
                    {
                        return;
                    }
                case "HELP":
                    {
                        Console.WriteLine("- enter EXIT to exit this application");
                        Console.WriteLine("- enter CLS to clear the screen");
                        Console.WriteLine("- enter FORECOLOR value to change text fore color (sample: FORECOLOR Red) ");
                        Console.WriteLine("- enter BACKCOLOR value to change text back color (sample: FORECOLOR Green) ");
                        break;
                    }
                case "CLS":
                    {
                        Console.Clear();
                        break;
                    }

                case "FORECOLOR":
                    {
                        try
                        {
                            Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters);
                        }
                        catch
                        {
                            Console.WriteLine("!!! Parameter not valid");
                        }

                        break;
                    }
                case "BACKCOLOR":
                    {
                        try
                        {
                            Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters);
                        }
                        catch
                        {
                            Console.WriteLine("!!! Parameter not valid"); 
                        }

                        break;
                    }
                default:
                    {
                        Console.WriteLine("!!! Bad command");
                        break;
                    }
            }
        }
    }
0 голосов
/ 05 января 2011

Это очень упрощенно, но может удовлетворить ваши потребности.

// somewhere to store the input
string userInput="";

// loop until the exit command comes in.
while (userInput != "exit")
{
    // display a prompt
    Console.Write("> ");
    // get the input
    userInput = Console.ReadLine().ToLower();

    // Branch based on the input
    switch (userInput)
    {
        case "exit": 
          break;

        case "help": 
        {
          DisplayHelp(); 
          break;
        }

        case "option1": 
        {
          DoOption1(); 
          break;
        }

        // Give the user every opportunity to invoke your help system :)
        default: 
        {
          Console.WriteLine ("\"{0}\" is not a recognized command.  Type \"help\" for options.", userInput);
          break;
        }
    }
}
0 голосов
/ 05 января 2011
switch (Console.ReadLine())
{
    case "Help":
        // print help
        break;

    case "Other Command":
        // do other command
        break;

    // etc.

    default:
        Console.WriteLine("Bad Command");
        break;
}

Если вы хотите проанализировать команды, в которых есть другие вещи, такие как параметры, например, «манипулировать файлом.txt», то это само по себе не сработает.Но вы можете, например, использовать String.Split для разделения ввода в команду и аргументы.

0 голосов
/ 05 января 2011

Console.WriteLine Console.ReadLine и Console.ReadKey ваши друзья. ReadLine и ReadKey ждут пользовательского ввода. string[] args будет иметь все ваши параметры, такие как «помощь» в них. Массив создается путем разделения аргументов командной строки пробелами.

0 голосов
/ 05 января 2011

Это достаточно просто, просто используйте методы Console.WriteLine и Console.ReadLine(). Из ReadLine вы получаете строку. Вы можете иметь ужасное утверждение if, которое проверяет это на соответствие известным / ожидаемым данным. Лучше было бы иметь таблицу поиска. Самым сложным было бы написать парсер. Это действительно зависит от того, насколько сложными могут быть входные данные.

...