1、CliWrap(Cli)下载安装
1)通过dotnet命令安装
dotnet add package CliWrap
2)通过Nuget管理器安装
相关文档:VS(Visual Studio)中Nuget的使用
3)持续集成安装
相关文档:https://ci.appveyor.com/project/Tyrrrz/CliWrap
2、CliWrap(Cli)用法
1)执行命令
var result = await Cli.Wrap("cli.exe") .SetArguments("Hello world!") .ExecuteAsync();//如果想阻塞进程,则可以使用Execute()方法 var exitCode = result.ExitCode; var stdOut = result.StandardOutput; var stdErr = result.StandardError; var startTime = result.StartTime; var exitTime = result.ExitTime; var runTime = result.RunTime;
2)参数列表编码
可以通过将命令行参数作为列表传递来自动对其进行编码。
var result = await Cli.Wrap("cli.exe") .SetArguments(new[] {"--option", "some value"}) .ExecuteAsync();
3)操作标准输入
可以将stdin作为字符串或二进制流传递。
var result = await Cli.Wrap("cli.exe") .SetStandardInput("Hello world from stdin!") .ExecuteAsync();
4)设置环境变量
可以配置仅对子进程可见的环境变量。
var result = await Cli.Wrap("cli.exe") .SetEnvironmentVariable("var1", "value1") .SetEnvironmentVariable("var2", "value2") .ExecuteAsync();
5)取消执行
可以在任何时候使用取消执行CancellationToken,这也将终止子进程。
using (var cts = new CancellationTokenSource()) { cts.CancelAfter(TimeSpan.FromSeconds(5)); // e.g. 5秒超时 var result = await Cli.Wrap("cli.exe") .SetCancellationToken(cts.Token) .ExecuteAsync(); }
6)stdout和stderr的回调
可以连接自己的回调,这些回调将在stdout或stderr中的每一行上触发。
var result = await Cli.Wrap("cli.exe") .SetStandardOutputCallback(l => Console.WriteLine($"StdOut> {l}")) // triggered on every line in stdout .SetStandardErrorCallback(l => Console.WriteLine($"StdErr> {l}")) // triggered on every line in stderr .ExecuteAsync();
7)错误处理
可以配置非零退出代码或非空stderr是否应该抛出异常。
var result = await Cli.Wrap("cli.exe") .EnableExitCodeValidation(true) // 在非零退出码上抛出异常(默认打开) .EnableStandardErrorValidation(true) // 在非零退出码上抛出异常(默认打开) .ExecuteAsync();