.net core 使用AddCommandLine后如何检索args数组
我正在为一个控制台应用程序开发POC,在设置中使用AddCommandLine之后,我正在努力从配置中检索命令行值 csproj.net core 使用AddCommandLine后如何检索args数组,.net-core,command-line-parser,.net Core,Command Line Parser,我正在为一个控制台应用程序开发POC,在设置中使用AddCommandLine之后,我正在努力从配置中检索命令行值 csproj <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> 执行命中DoWork方法。很好,但是DeleteOpt
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
执行命中DoWork方法。很好,但是DeleteOptions.cs定义了一个动词,目的是添加更多命令。因此,还有更多的工作要做,但要走正确的道路
[编辑]我还意识到我不需要添加
AddCommandLine()
调用,因为它们是默认添加的。好吧,我似乎把这件事复杂化了,结果是:
public static class Program
{
public static async Task Main(string[] args)
{
var builtHost = CreateHostBuilder(args).Build();
var console = builtHost.Services.GetService<ConsoleApp>();
await console.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("settings.json", true, true);
config.AddCommandLine(args);
})
.ConfigureServices((hostcontext, services) =>
{
services.AddTransient<ConsoleApp>();
});
}
公共静态类程序
{
公共静态异步任务主(字符串[]args)
{
var builhost=CreateHostBuilder(args.Build();
var console=buildhost.Services.GetService();
wait console.Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.useserlog()
.ConfigureAppConfiguration((hostingContext,config)=>
{
config.AddJsonFile(“settings.json”,true,true);
config.AddCommandLine(args);
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddTransient();
});
}
这是ConsoleApp中的run方法:
public Task Run()
{
while (true)
{
var input = ReadFromConsole();
if (string.IsNullOrWhiteSpace(input))
{
continue;
}
else if (input.ToLower().Equals("exit"))
{
break;
}
else
{
Parser.Default.ParseArguments<DeleteOptions, ConcatOptions, DownloadOptions, ReportOptions>(input.Split(" "))
.WithParsed<DeleteOptions>(async options => await options.DoWork())
.WithParsed<ConcatOptions>(async options => await options.DoWork())
.WithParsed<DownloadOptions>(async options => await options.DoWork())
.WithParsed<ReportOptions>(async options => await options.DoWork())
.WithNotParsed(HandleParseError);
}
}
return Task.CompletedTask;
}
公共任务运行()
{
while(true)
{
var input=ReadFromConsole();
if(string.IsNullOrWhiteSpace(输入))
{
继续;
}
else if(input.ToLower().Equals(“exit”))
{
打破
}
其他的
{
Parser.Default.ParseArguments(input.Split(“”)
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.WithParsed(异步选项=>await options.DoWork())
.未解析(HandleParseError);
}
}
返回Task.CompletedTask;
}
这可以让我把它作为一个交互式控制台应用程序使用。不过,我确实对DI有问题。我已经创建了一个OptionsBase类来设置日志记录,我是这样做的,因为尝试向任何选项类添加参数都失败,无法找到无参数构造函数。所以我假设命令行需要默认构造函数才能工作。以我现有的方式获取记录器会给我多个日志文件,因此我需要修复它
var args = config.GetValue<string>("delete");
string[] arguments = null;
if(!string.IsNullOrEmpty(args))
{
var tempArgs = args.Split(" ");
arguments = new string[tempArgs.Length + 1];
arguments[0] = "delete";
for(int i = 0; i < tempArgs.Length; ++i)
{
arguments[i + 1] = tempArgs[i];
}
}
Parser.Default.ParseArguments<DeleteOptions>(arguments)
.WithParsed<DeleteOptions>(async c => await c.Dowork())
.WithNotParsed(HandleParseError);
public static class Program
{
public static async Task Main(string[] args)
{
var builtHost = CreateHostBuilder(args).Build();
var console = builtHost.Services.GetService<ConsoleApp>();
await console.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("settings.json", true, true);
config.AddCommandLine(args);
})
.ConfigureServices((hostcontext, services) =>
{
services.AddTransient<ConsoleApp>();
});
}
public Task Run()
{
while (true)
{
var input = ReadFromConsole();
if (string.IsNullOrWhiteSpace(input))
{
continue;
}
else if (input.ToLower().Equals("exit"))
{
break;
}
else
{
Parser.Default.ParseArguments<DeleteOptions, ConcatOptions, DownloadOptions, ReportOptions>(input.Split(" "))
.WithParsed<DeleteOptions>(async options => await options.DoWork())
.WithParsed<ConcatOptions>(async options => await options.DoWork())
.WithParsed<DownloadOptions>(async options => await options.DoWork())
.WithParsed<ReportOptions>(async options => await options.DoWork())
.WithNotParsed(HandleParseError);
}
}
return Task.CompletedTask;
}