我想知道当你可能有数百个参数时,是否有一个优雅的解决方案来构建针对exe启动的命令行。
我想最明显的方法是使用if/else语句并构建一个巨大的字符串,但是感觉不到特别优雅。以前有人解决过这个问题吗?澄清
假设我正在编写一个程序,该程序启动程序notepad.exe,该程序本身可通过接受命令行参数进行配置。
我的程序的唯一目的是构建命令行并启动应用程序。
这样我就有了一个包含所有我可以在记事本中设置的选项的表单。
单选按钮的WordWrap是/否。字体组合框输入框设置字体大小
当我点击"启动"按钮时,我会运行"notepad.exe -wordwrap yes -font tahoma -size 8"。
所以我的问题是:
- 你会如何处理构建命令行的表单逻辑,你会有一个类的属性为每个参数?并有一个构建()方法组装他们所有?
- 如何将参数传递给可执行文件?
我在寻找一个优雅的解决方案,而不是像:
if (chkWordWrap == true)
commandline.add("-wordwrap true")
我希望这能澄清我的问题:)
如果您有一个可执行文件在命令行上接受百分之一的参数,那么这个特定的可执行文件不太可能期望您在命令行上逐字键入这些参数。这些程序中的大多数都可以处理包含命令行的输入文件。
优雅地:让你的程序编写这样的输入文件,并使用Process
以正常的方式对程序运行它,类似于以下几行:
Process proc = new Process();
proc.StartInfo.FileName = "externalprogram.exe";
proc.StartInfo.Arguments = "input file here.txt";
proc.Start();
你可以尝试列出/映射对象的参数名和可能的值(或方法计算值基于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);
}
}
我有点不确定您在要求什么,但听起来您正在寻找一种解析命令行参数的优雅方法。我建议看一下CodeProject上的这个参数解析器。使用解析器,您可以获得如下参数:
static void Main(string[] args)
{
Arguments cmdArgs = new Arguments(args);
Console.WriteLine(cmdArgs["arg_name"]);
}
要构建命令行字符串,您可以尝试使用` Heleonix。Execution'库,它提供了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""
您可以添加单独的键,单独的值,键/值参数,路径(默认情况下用"…"包装)和上述所有列表,并使用条件表达式定义是否应该添加它们(而不是编写if
语句)。任何命令行参数都可以使用ArgsBuilder本身构建,因此可以嵌套,因为ArgsBuilder实例被隐式地强制转换为System。字符串,所以不需要调用*.ToString()