WPF命令行参数,一种聪明的方式?

时间:2012-02-18 17:25:18

标签: c# wpf command-line-arguments

我正在寻找一种方法,可以将命令行参数解析为我的WPF应用程序,只需读取用户传递的参数值即可。

作为一个例子

application.exe /setTime 5

我有办法让我可以说一些代码:

MessageBox.Show(arg("setTime"));

将输出5

工作解决方案

How to create smart WPF Command Line Arguments

3 个答案:

答案 0 :(得分:89)

我一直这样做的方法是将参数指定为“名称”/“值”对,例如。

myprogram.exe -arg1 value1 -arg2 value2

这意味着当您解析命令行时,可以将参数/值对放在Dictionary中,并将参数作为键。然后您的arg("SetTime")将成为:

MessageBox.Show(dictionary["SetTime"]);

(显然你不希望实际的字典公开。)

首先要获取参数:

string[] args = Environment.GetCommandLineArgs();

这将返回所有参数,因此您需要以两步为单位解析数组(在首先检查长度是2 + 1的倍数之后):

数组的第一个元素是执行程序的名称 - MSDN Page - 所以你的循环需要从一个开始:

for (int index = 1; index < args.Length; index += 2)
{
     dictionary.Add(args[index], args[index+1]);
}

当你定义每个参数时,它以2为步进循环是一对值:标识符和实际值本身,例如。

my.exe -arg1 value1 -arg2 value2

然后你可以通过查看键-arg1是否在字典中然后读取它的值来查看是否指定了参数:

string value;
if (dictionary.TryGetValue(arg, out value))
{
    // Do what ever with the value
}

这意味着您可以按任何顺序获取参数,并省略您不想指定的任何参数。

答案 1 :(得分:0)

在WPF中还有另一种方法。这是一个article,下面是采取的步骤:

首先,您打开App.xaml,然后在Startup="Application_Startup"之后添加StartupUri="Window1.xaml",这样您的App.xaml将会像这样:

<Application x:Class="ParametersForWPF.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

然后函数Application_Startup将自动添加到您的App.xaml.cs文件中:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }
}

现在,在此功能内,您可以检查发送到应用程序的args。一个示例是:

private void Application_Startup(object sender, StartupEventArgs e)
{
    foreach(string s in e.Args)
    {
        MessageBox.Show(s);
    }
}

如果您需要将它们作为Dictionary,则可以在Application_Startup函数中轻松实现ChrisF's answer

答案 2 :(得分:0)

这就是我处理两种类型的参数的方式

myapp.exe -my-flag -another-flag -value-flag "Hello World"

Dictionary<string, string> arguments = new Dictionary<string, string>()

//e from StartupEventArgs e

for (int index = 0; index < e.Args.Length; index += 2)
{
    if(e.Args.Length == index+1 || e.Args[index + 1].StartsWith("-"))
    {
        arguments.Add(e.Args[index], string.Empty);
        index--;
    }
                    

    if (e.Args.Length >= index + 1 && !e.Args[index + 1].StartsWith("-"))
        arguments.Add(e.Args[index], e.Args[index + 1]);
}

然后您可以像这样检查您的值。

if(arguments.ContainsKey("my-flag")){
   arguments.TryGetValue("value-flag", valueFlag)
}