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

Posted

技术标签:

【中文标题】WPF命令行参数,一种聪明的方法?【英文标题】:WPF Command Line Arguments, a smart way? 【发布时间】:2012-03-09 17:54:11 【问题描述】:

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

举个例子

application.exe /setTime 5

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

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

这将输出5

工作解决方案

How to create smart WPF Command Line Arguments

【问题讨论】:

相关WPF Command Line 您是否尝试过查看 codeplex?命令行解析有很多不同的实现。 有很多库可以处理命令行参数,参见:***.com/questions/491595/… 您可以使用应用程序***.com/a/55667794/1115166的 OnStartup 来查看此内容 【参考方案1】:

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

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),但如果您有确实需要值的标志(如配置文件路径、数据库连接字符串等),它确实可以简化事情

【讨论】:

工作,比我想象的要简单得多。非常感谢 如果给定的参数个数是奇数怎么办?为避免异常使用 for (int index = 1; index @JPollack - 如果您的参数数量不均匀,则缺少某些内容,因此您必须报告错误。 我不相信每个参数都是一对值。这是您的软件,因此您可以决定各种参数的含义。它们是由空格分隔的值。请参阅有关它的 MDSN 页面。要查看它们,只需使用以下命令: Console.WriteLine("0", String.Join(", ", Environment.GetCommandLineArgs())); @ChrisF - 这是你的设计决定,这个答案表明这是系统工作的唯一方式,这是错误的。例如,您可以简单地执行此操作 my.exe -dothis -dothat 不需要值,甚至在参数之前使用 - 是您的设计决定。参数不是成对指定的,因此任何开发人员都可以随心所欲。答案暗示并非如此。或者,您可以使用 my.exe -dothis:haha -dothat:hehe 这就是您想要如何设计软件的全部内容。你回答了这个问题,但毫无疑问。我的评论有助于扩大可能性。【参考方案2】:

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

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

【讨论】:

我认为重写 OnStartup 而不是使用事件处理程序会更好。与此处所述的原因相同:***.com/a/3670912/5491112【参考方案3】:

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

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)

【讨论】:

以上是关于WPF命令行参数,一种聪明的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MvvmCross 在 WPF 应用程序中获取命令行参数?

wpf程序调用cmd命令行的方法(C#语言调用C++写的程序)?

将命令行参数从 VB 传递到 C# WPF 应用程序

c#winform高手来!!怎样让winform 通过命令行运行且不弹出form窗口

scrapy 怎样添加命令行参数

Wpf Application类的任务: