我正在尝试在C#应用程序中读取用户参数。我知道如何根据位置
来阅读它们string[] args = Environment.GetCommandLineArgs();
但我想从开关中读取它们,例如
app.exe /f /d:foo
我真的很难找到关于这样做的任何信息...
答案 0 :(得分:25)
为什么不解析传递的参数数组并根据它们进行操作,比如
foreach (string arg in args)
{
switch (arg.Substring(0, 2).ToUpper())
{
case "/F":
// process argument...
break;
case "/Z":
// process arg...
break;
case "/D":
paramD = arg.Substring(3);
break;
default:
// do other stuff...
break;
}
}
答案 1 :(得分:4)
void Main(string[] args )
{
foreach( var arg in args )
{
// process each arg if needed, i.e.,
// remove '-', '/', uppercase, whatever
switch(arg)
{
case "blah":
// ...
}
}
}
为此目的确实存在库,这使得整个过程变得更加容易,但如果这是一个一次性应用程序,它可能不值得。取决于命令行参数的复杂程度。
答案 2 :(得分:3)
怎么样,
// first is exe of executing program
string[] args = Environment.CommandLine.Split('/').Skip(1).ToArray();
foreach (string arg in args)
{
string value = arg.Trim();
switch (value)
{
case "f":
//...
continue;
}
if (value.StartsWith("d:"))
{
value = value.Substring(2);
// ...
continue;
}
}
答案 3 :(得分:3)
我已经看到了几个循环遍历args字符串集合的答案 - 问题是你在点击正在寻找的开关后需要下一个项目。我使用了集合的数组索引来获取下一个项目。
在我的示例中,我正在寻找服务器和端口/ S和/ P.我希望这有助于某人:
var server = string.Empty;
var port = string.Empty;
for(var x = 0; x < args.Count(); x++)
{
switch (args[x].Trim().ToUpper())
{
case "/S":
server = args[x + 1];
break;
case "/P":
port = args[x + 1];
break;
}
}
答案 4 :(得分:0)
string[]
数组并完成。
没有内置的方法来实现您的要求。
像第三方解决方案可以看看
答案 5 :(得分:0)
答案 6 :(得分:0)
我相信你必须推出自己的实现。在编写单元测试以评估新方法之后,我可能会开始考虑......
foreach (string arg in args)
{
flagF = flagF || arg == "/f"; // assuming F is boolean
flagD = flagD ?? (arg.Substring(0,3) =="/d:" ? arg.Substring(3) : null);
}
答案 7 :(得分:0)
一些可能感兴趣的包:
Microsoft.Extensions.CommandLineUtils
包:
https://www.areilly.com/2017/04/21/command-line-argument-parsing-in-net-core-with-microsoft-extensions-commandlineutils/System.CommandLine
包(在撰写本文时预发布):
https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/march/net-parse-the-command-line-with-system-commandline