如何实现自定义命令行&执行

时间:2018-06-13 10:24:41

标签: c# command-line command

我正在尝试为我的应用程序构建一个自定义命令行,我有几个基本命令,我只是使用一堆" if"用于检查命令是什么的语句。目前它看起来像这样

     boost::thread myThread(&my_lengthly_method);
     myThread.detach();
 }

基本上就是这样。我有一个mainForm和命令行表单。将字符串输入键入命令行,然后检查命令名称并从mainForm执行一些函数。

我的问题是,实施此类事情的最佳方式是什么?我当然可以继续写一堆" if" s,但有些东西告诉我它不是最好的方法。

我想过创建课程" Command"

public void ExecuteCommand()
    {
        string input = ReadLine(); //gets last string from input
        bool isDone = false; //need bool to check whether command was executed or no, by default false.

        Match result = Regex.Match(input, @"([^\s]+)"); //to get command name
        string commandName = result.Value.ToLower();

        string value = Regex.Match(input, @"\s(.*)").Value; //to get its parameter. currently everything after ' ' space.

        if (commandName == "close")
        {
            Close(); isDone = true;
        }

        //so commandline is separate window, and appendedForm is a main form. in which some functions are executed.

        if (commandName == "exit")
        {
            appendedForm.Close();
        }

        if (commandName == "spoof")
        {
            appendedForm.Fn_Spoof();
            isDone = true;
        }

        if(commandName == "spoofstop")
        {
            appendedForm.Fn_StopCapture();
            isDone = true;
        }

        if(commandName == "scan")
        {
            appendedForm.Fn_Scan(); isDone = true;
        }

        if(commandName == "clear")
        {
            output.Text = "";
            WriteLine("Console cleared. Cache is empty.");
            //data_lines.Clear();

            isDone = true;

        }
        ...
}

并将所有命令存储在某种数组中,但我不知道如何使用它来调用mainForm中的函数。

欢迎任何想法!

1 个答案:

答案 0 :(得分:1)

您可以将所有命令填入Dictionary<string, someDelegate>;如果你能使用具有相同返回类型的所有命令。

我使用了字符串并设置了一些命令。

我使用params关键字来避免每次调用时出现丑陋的new object[]

你仍然需要强制转换参数,除非你可以将它们全部变为一种类型。 (实际上这可能不是一个坏主意,因为它们都来自输入字符串..)

以下是一个例子:

public delegate string cmdDel(params object[] args);

Dictionary<string,  cmdDel> cmd = new Dictionary<string,  cmdDel>();

添加一些功能:

cmd.Add("clear", cmd_clear);
cmd.Add("exit", cmd_exit);
cmd.Add("add", cmd_add);
cmd.Add("log", cmd_log);

有了这些机构:

public string cmd_clear(params object[] args)
{
    return "cleared";
}

public string cmd_exit(params object[] args)
{
    return "exit";
}

public string cmd_add(params object[] args)
{
    return ((int)args[0] + (int)args[1]).ToString();
}

public string cmd_log(params object[] args)
{
    StringBuilder log = new StringBuilder();
    foreach (object a in args) log.Append(a.ToString() + " ");
    return log.ToString(); 
}

并测试:

Console.WriteLine(cmd["clear"]());
Console.WriteLine(cmd["add"]( 23, 42));
Console.WriteLine(cmd["log"]( 23, "+" + 42, "=", cmd["add"]( 23, 42) ));
Console.WriteLine(cmd["exit"]());
  

清除

     

65

     

23 + 42 = 65

     

出口

当然,您仍然需要使用(至少)尽可能多的行来设置命令。并且还需要进行类似数量的错误检查。

但命令处理部分可以变得非常简单。