在C#中以编程方式构建命令行

时间:2011-11-15 19:13:40

标签: c# command-line

当我可能有数百个参数时,我想知道是否有一个优雅的解决方案来构建命令行以针对exe启动。

我想最明显的方法是使用if / else语句并构建一个巨大的字符串,但它不会感觉感觉特别优雅。有没有人之前已经解决了这个问题?

澄清

假设我正在编写一个启动程序notepad.exe的程序,该程序本身可以通过接受命令行参数进行配置。

我的程序唯一目的是构建命令行并启动应用程序。

所以我会有一个表格,其中包含我可以在记事本中设置的所有选项。

用于WordWrap的Radiobutton是/否。 Combobox for Font FontSize的输入框。

当我点击“启动”按钮时,我会运行“notepad.exe -wordwrap yes -font tahoma -size 8”。

所以我的问题如下:

  • 你如何处理构建命令行的表单逻辑,你是否有一个充满每个参数属性的类?并且有一个Build()方法将它们组合在一起吗?
  • 您如何将参数传递给可执行文件?

我正在寻找一个优雅的解决方案,而不是像:

if (chkWordWrap == true)
 commandline.add("-wordwrap true")

我希望澄清我的要求:)

4 个答案:

答案 0 :(得分:2)

如果您的可执行文件在命令行上接受了百分之一的参数,则该特定可执行文件不太可能希望您在命令行上按字面键入这些参数。大多数这些程序都可以使用包含命令行的输入文件。

优雅:让你的程序编写这样的输入文件,然后使用Process以正常方式对程序运行,这些内容如下:

Process proc = new Process();
proc.StartInfo.FileName = "externalprogram.exe";
proc.StartInfo.Arguments = "input file here.txt";
proc.Start();

答案 1 :(得分:1)

您可以尝试使用具有参数名称和可能值的对象的列表/映射(或基于UI元素计算值的方法),然后迭代遍历所有项目并输出参数名称+值。

class Parameter
{
 public Parameter(Control control)...
 public string name;
 public bool neededBasedOnControl()...
 public string valueByControl()...
}

List<Parameter> allParameters = new List<Parameter>();
allParameters.Add(new Parameter(myControl42);

...
StringBuilder args;
foreach(var p in allParameter)
{
  if (p.neededBasedOnControl())
  {
    args.Format(p.name, p.valueByControl);
  }
}

答案 2 :(得分:0)

我有点不确定你要求的是什么,但听起来你正在寻找一种优雅的方法来解析命令行参数。我建议在CodeProject上查看这个argument parser。使用解析器,您可以获得如下参数:

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

    Console.WriteLine(cmdArgs["arg_name"]);
}

答案 3 :(得分:0)

要构建命令行字符串,您可以尝试&#39; Heleonix.Execution&#39; library,提供ArgsBuilder类: https://github.com/Heleonix/Heleonix.Execution/blob/master/README.md 您可以构建命令行字符串,如下所示:

var args = ArgsBuilder.By("--", "=")
            .AddPath("app", "http://www.google.com")
            .AddArgument("window-size", "300,300", isSized)
            .AddKey("new-window", isNewWindow);

// Depending on conditions, command line arguments can be like:

// "--app="http://www.google.com" --window-size=300,300 --new-window"
// "--app="http://www.google.com" --window-size=300,300"
// "--app="http://www.google.com" --new-window"
// "--app="http://www.google.com""

您可以添加单独的键,单独的值,键/值参数,路径(默认情况下包含&#34; ...&#34;以及上述所有条件表达式的列表)应该添加或不添加(而不是写if语句)。 您可以使用ArgsBuilder本身构建任何命令行参数,因此您可以进行嵌套,因为ArgsBuilder实例隐式转换为System.String,因此无需调用*.ToString()