在终端或cmd中,你可以编写命令,其中有一个主命令,然后是子命令,或者参数和东西......就像这样:
cd Desktop\Folder
lst
Format E: /fs:FAT32
我想创建一个C#控制台应用程序,它可以执行这样的预定义命令,但也可以拆分主命令和子命令,其中一些可以是可选的,一些不是。我尝试将所有字符串作为字符串,然后将其拆分为数组并创建if(s)
和switch
以及case
s,但它看起来非常糟糕且难以管理。我确信在操作系统的终端或cmd中它以另一种方式构建。你能帮我理解一下这个应用程序的基本结构吗?
答案 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)
这是一个类似于 CMD 或 Bash 的命令解释器。 我们在MIT许可证下发布了它,这是一个在C#(.NET Core)中具有一些功能的shell。如果您愿意,您可以捐款 的 GitHub 强>
为了解决将给定令牌(命令行的一部分)与内置命令或命令匹配的问题,我们使用字典。
但是,我们暂时不会对路径中的程序编制索引。我们只是将程序的名称与.h
变量中的所有路径组合在一起。
%PATH%
/ %PATH%
虽然您不太可能找到CMD的内部工作(因为它是封闭源代码),但您可以轻松找到unix shell(bash,sh,zsh等)信息。
<强> 链接: 强>