.NET Core中,可以使用 CliWrap 库来调用系统命令(如cmd或sh),并处理其输出。CliWrap 是一个方便的库,用于执行和管理外部命令行程序。CliWrap是一个库,可以更轻松地与命令行界面进行交互。它为目标可执行文件提供了一个方便的包装器,可以传递执行参数并读取结果输出。该库还可以处理底层进程报告的错误,可以命令取消并具有同步和异步API。

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();

参考文档https://github.com/Tyrrrz/CliWrap

推荐文档