繁体   English   中英

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

[英]WPF Command Line Arguments, a smart way?

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

举个例子

application.exe /setTime 5

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

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

哪个将输出5

工作解决方案

如何创建智能 WPF 命令行参数

我总是这样做的方式是将参数指定为“名称”/“值”对,例如

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]);
}

当您定义每个参数是一对值时,这将分两步循环:标识符和实际值本身,例如

my.exe -arg1 value1 -arg2 value2

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

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

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

这种方法的唯一缺点是,如果您有一个像-debug (例如)这样的标志,可以在逻辑上实现该标志的存在或不存在,则需要将其指定为-debug true (或1on ),但它确实简化事情,如果你有确实需要值标志(如配置文件路径,数据库连接字符串等)

在 WPF 中还有另一种方法可以做到这一点。 这是一篇关于它的文章,这里是要采取的步骤:

首先,您打开App.xaml并在StartupUri="Window1.xaml" Startup="Application_Startup"之后添加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 的答案

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

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM