web-dev-qa-db-ja.com

「高度な」コンソールアプリケーション

この質問が他の場所で回答されているかどうかはわかりません。また、「HelloWorld」の例ではないものをGoogleで見つけることができないようです...私はC#.NET4.0でコーディングしています。

開いてテキストを表示し、ユーザーがコマンドを入力するのを待つコンソールアプリケーションを開発しようとしています。コマンドは、特定のビジネスロジックを実行します。

例:ユーザーがアプリケーションを開いて「help」と入力した場合、いくつかのステートメントなどを表示したいのですが、ユーザー入力用の「イベントハンドラー」をコーディングする方法がわかりません。

うまくいけば、これは理にかなっています。どんな助けでも大歓迎です!乾杯。

14
keynesiancross

これを達成するにはいくつかの手順が必要ですが、それほど難しくはありません。まず、書いたものを解析するある種のパーサーが必要です。各コマンドを読み取るには、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();
               .
               .
               .
               .
         }
    }
}
21
Tomas Jansson

これは古い質問だと思いますが、私も答えを探していました。簡単なものが見つからなかったので、InteractivePromptを作成しました。 NuGet Package として利用可能であり、 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);
}
1
sorrell

これは非常に簡単です。_Console.WriteLine_メソッドとConsole.ReadLine()メソッドを使用するだけです。 ReadLineから文字列を取得します。既知の/予想される入力に対してこれを検証する恐ろしいifステートメントがある可能性があります。ルックアップテーブルを用意することをお勧めします。最も洗練されているのは、パーサーを作成することです。それは、入力がどれほど複雑になるかによって異なります。

0
John Pickup

Console.WriteLineConsole.ReadLineおよびConsole.ReadKeyはあなたの友達です。 ReadLineとReadKeyはユーザー入力を待ちます。 string[] argsには、「ヘルプ」などのすべてのパラメータが含まれます。配列は、コマンドライン引数をスペースで区切って作成されます。

0
Joe
switch (Console.ReadLine())
{
    case "Help":
        // print help
        break;

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

    // etc.

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

「manipulatefile.txt」など、パラメータなどの他のものが含まれているコマンドを解析しようとしている場合、これだけでは機能しません。ただし、たとえばString.Splitを使用して、入力をコマンドと引数に分けることができます。

0
Tesserex

これは非常に単純ですが、ニーズを満たす可能性があります。

// 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
Brett

サンプル:

    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
HABJAN