C#: 如何检测输入到控制台应用程序的参数?

19
我该如何在C#控制台应用程序中检测输入?
例如,我想让控制台应用程序在启动时写入“欢迎来到美食屋”,并且可以检测两个命令:
1:/help - 显示一些帮助信息。
2:/food pizza -t pepperoni -d pepsi - 显示“所以你想要一份加了意大利辣香肠和百事可乐的披萨?”
那么我该如何首先检测输入的/command是什么,并且如果输入/food pizza,则读取像-t pepperoni(配料)和-d pepsi(饮料)这样的参数?
我的主要问题是如何检测第一个单词,然后判断是否为/help,如果是,则调用某个方法将一些帮助文本发布到控制台,或者如果命令是/food,则读取/food命令之后的内容,-t和-p。
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome To Food Hut");
        Console.ReadLine();

        // if readline equals to /help then display some help text.


        // if /food command is typed, read first argument after /food Pizza, -t TheTopping
        // and -p ForWhatToDrink

        // and then display, 'So you would like a Pizza with Pepperoni and Pepsi to drink?'
    }
8个回答

40
我推荐使用Richard Lopes的命令行参数解析器。它功能强大且使用非常简单。此外,它还接受不同方式的参数指定,例如:

  • /name=Stefan
  • --name=Stefan
  • --name="多个单词"
  • -name 'Stefan'

示例代码:

static void Main(string[] args)
{
    Arguments cmdline = new Arguments(args);

    Console.WriteLine(cmdline["name"]);
}

这是唯一的出路!非常感谢Richard Lopes和Stefan Schultze。 - PseudoToad
参数对象从哪里来?我的命令行项目无法识别它。 - theJerm
@theJerm 这绝对是老的,你可能已经弄清楚了,但对于那些可能不知道的人...在使用之前,您必须从Stefan的链接中将Arguments类复制到您的项目中。 - fujiiface

3

我的直接建议是这样的:

string input = Console.ReadLine();
if (input == "/help") { }
else if (input.StartsWith("/food")) { }
else { //... }

除此之外,下一个最简单的解决方案涉及正则表达式。如果您需要真正可扩展的内容,您可以研究词法分析器/语法分析器。
但是,另一方面,有些事情告诉我您的问题解决方式可能不正确。也许向用户显示菜单会更容易,类似于以下内容:
Food:
1) Tofu
2) Tempeh
3) Seitan
4) Soup

Choice (1-4)? [users input]

Drink:
1) Pepsi
2) Coffee
3) Water
4) Tea
5) Juice

Choice (1-5)? [users input]

对于用户来说,编号菜单可能更容易理解。


3
使用string.split方法可以找到所有被空格分隔的单词。
input = Console.ReadLine();
string[] commands = input.Split(' ');
if(commands[0] == "/food")
{
 if(commands[1] == "Pizza");
   .....
}

2
跳过编码基础,你可能想看看 Genghis 项目 的命令行解析子项目,由 Chris Sells 开发。它是链接页面上表格中的第一个项目。

0

查看 String.Contains


0

Paul 是对的,你需要使用不同的String成员来完成这个任务。

MSDN

如果你感觉非常专业,可以考虑使用String.Text.RegularExpression类来解析文本,但是作为起点,请使用string成员。

还可以尝试谷歌一下C#字符串解析。


0
发现了gsscoder/commandline。这是一个干净的面向对象实现,可以通过NuGet获得。

-3

这种情况怎么办?

mssinp.exe -cf "C:\Temp\config.txt"

参数的值将被拆分为

[0] 'C'
[1] '\Temp\config.txt'

请仅返回翻译后的文本:将以下与编程相关的内容从英文翻译成中文。 - rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接