开发手册 欢迎您!
软件开发者资料库

.NET Core 通过CliWrap(Cli)调用系统命令(cmd、sh)方法

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