实现命令行解释器

时间:2015-09-08 22:29:20

标签: c# command-line

在终端或cmd中,你可以编写命令,其中有一个主命令,然后是子命令,或者参数和东西......就像这样:

cd Desktop\Folder
lst
Format E: /fs:FAT32

我想创建一个C#控制台应用程序,它可以执行这样的预定义命令,但也可以拆分主命令和子命令,其中一些可以是可选的,一些不是。我尝试将所有字符串作为字符串,然后将其拆分为数组并创建if(s)switch以及case s,但它看起来非常糟糕且难以管理。我确信在操作系统的终端或cmd中它以另一种方式构建。你能帮我理解一下这个应用程序的基本结构吗?

2 个答案:

答案 0 :(得分:3)

在这里,看看这个概念。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SharpConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Welcome to SharpConsole. Type in a command.");

            while (true)
            {
                Console.Write("$ ");
                string command = Console.ReadLine();

                string command_main = command.Split(new char[] { ' ' }).First();
                string[] arguments = command.Split(new char[] { ' ' }).Skip(1).ToArray();
                if (lCommands.ContainsKey(command_main))
                {
                    Action<string[]> function_to_execute = null;
                    lCommands.TryGetValue(command_main, out function_to_execute);
                    function_to_execute(arguments);
                }
                else
                    Console.WriteLine("Command '" + command_main + "' not found");
            }
        }

        private static Dictionary<string, Action<string[]>> lCommands = 
            new Dictionary<string, Action<string[]>>()
            {
                { "help", HelpFunc },
                { "cp" , CopyFunc }
            };

        private static void CopyFunc(string[] obj)
        {
            if (obj.Length != 2) return;
            Console.WriteLine("Copying " + obj[0] + " to " + obj[1]);
        }

        public static void HelpFunc(string[] args)
        {
            Console.WriteLine("===== SOME MEANINGFULL HELP ==== ");
        }
    }
}

基本思想是概括命令的概念。我们有一个Dictionary,其中键是一个字符串(命令的名称),您从字典中获得的值是Action<string[]>类型的函数 。任何具有签名void Function(string[])的函数都可以用作此类型。然后,您可以使用一堆命令设置此字典,并将它们路由到您想要的功能。这些函数中的每一个都将接收一组可选参数。所以在这里,命令&#34; help&#34;将被路由到HelpFunc()。并且&#34; cp&#34;命令例如将收到一组文件名。解析命令始终是相同的。我们读了一行,把它分成了一个空格。第一个字符串是程序的名称command_main。如果跳过第一个字符串,您将获得您输入的所有其他子命令或开关的枚举。然后,在字典中进行查找以查看是否存在这样的命令。如果是,我们获取函数并使用参数执行它。如果没有,你应该显示&#34;命令not found&#34;或者其他的东西。总而言之,可以将此练习最小化,以在可能的命令字符串的字典中查找函数,然后执行它。所以可能的输出是

Welcome to SharpConsole. Type in a command. 
$ help
===== SOME MEANINGFULL HELP ==== 
$ cp file1 otherfile2 
Copying file1 to otherfile2 
$ python --version
Command 'python' not found
$ ...

答案 1 :(得分:2)

LXSH

这是一个类似于 CMD Bash 的命令解释器。 我们在MIT许可证下发布了它,这是一个在C#(.NET Core)中具有一些功能的shell。如果您愿意,您可以捐款 的 GitHub

为了解决将给定令牌(命令行的一部分)与内置命令或命令匹配的问题,我们使用字典。

但是,我们暂时不会对路径中的程序编制索引。我们只是将程序的名称与.h变量中的所有路径组合在一起。

  1. 捕获输入
  2. 展开环境变量,展开别名
  3. 尝试匹配内置并在匹配时运行
  4. 尝试与%PATH% / %PATH%
  5. 中的某个计划匹配
  6. 运行程序或显示错误
  7. 虽然您不太可能找到CMD的内部工作(因为它是封闭源代码),但您可以轻松找到unix shell(bash,sh,zsh等)信息。

    <强> 链接:

    Bash Reference
    Zsh Reference
    TCSH Reference