欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用 CliWrap 让C#中的命令行交互(推荐)

程序员文章站 2022-03-09 23:04:15
在代码中进行命令行交互是一个很常见的场景, 特别是在一些ci cd 自动化流程中, 在这之前我们会使用 system.diagnostics.process api, 现在有一个更灵活的工具 cli...

使用 CliWrap 让C#中的命令行交互(推荐)

在代码中进行命令行交互是一个很常见的场景, 特别是在一些ci cd 自动化流程中, 在这之前我们会使用 system.diagnostics.process api, 现在有一个更灵活的工具 cliwarp, 这是一个在 .net 平台使用的命令行交互工具库, 通过在c# 中使用 fluent 的api, 让命令行交互举重若轻。

https://github.com/tyrrrz/cliwrap

主要特性如下:

  • 基于 system.diagnostics.process
  • 简单, 流畅的 api 设计
  • 灵活的支持管道模式
  • 安全异步并且支持 cancellation api
  • 跨平台, 可在 windows、linux 和 macos 使用
  • 支持 .net standard 2.0+、.net core 3.0+、.net framework 4.6.1+

和 shell 是类似的,cliwrap 的基本工作单元是一个 command , 首先会执行 cli.wrap(...) 创建 command, 参数是可执行文件的路径, 然后通过 fluent api 配置, 最后调用 executeasync 运行命令,如下:

using cliwrap;
using cliwrap.buffered;

var result = await cli.wrap("path/to/exe") 
     //....
    .executebufferedasync(); 

配置参数

var cmd = cli.wrap("git")
    .witharguments("commit -m \"my commit\"");

var cmd = cli.wrap("git")
    .witharguments(new[] {"commit", "-m", "my commit"});
var cmd = cli.wrap("git")
    .witharguments(args => args
        .add("clone")
        .add("https://github.com/tyrrrz/cliwrap")
        .add("--depth")
        .add(20));  

配置工作目录

默认是当前目录, 你也可以指定文件夹的相对路径和绝对路径

var cmd = cli.wrap("git")
    .withworkingdirectory("c:/projects/my project/");

配置环境变量

var cmd = cli.wrap("git")
    .withenvironmentvariables(env => env
        .set("git_author_name", "john")
        .set("git_author_email", "john@email.com"));

超时和取消

using var cts = new cancellationtokensource(); 
 
cts.cancelafter(timespan.fromseconds(10));

var result = await cli.wrap("path/to/exe").executeasync(cts.token);

基于拉取的事件流

除了执行命令之外,cliwrap 还支持事件流模型, 可以订阅相关的事件回调。

  • startedcommandevent -- 仅接收一次,当命令开始执行时(包含 process id)
  • standardoutputcommandevent -- 每次底层进程向输出流写入新行时收到(包含文本作为字符串)
  • standarderrorcommandevent -- 每次底层进程向错误流写入新行时收到(包含文本作为字符串)
  • exitedcommandevent -- 仅接收一次,当命令完成执行时(包含 exit code)
using cliwrap;
using cliwrap.eventstream;

var cmd = cli.wrap("foo").witharguments("bar");

await foreach (var cmdevent in cmd.listenasync())
{
    switch (cmdevent)
    {
        case startedcommandevent started:
            _output.writeline($"process started; id: {started.processid}");
            break;
        case standardoutputcommandevent stdout:
            _output.writeline($"out> {stdout.text}");
            break;
        case standarderrorcommandevent stderr:
            _output.writeline($"err> {stderr.text}");
            break;
        case exitedcommandevent exited:
            _output.writeline($"process exited; code: {exited.exitcode}");
            break;
    }
}

输出结果如下:

使用 CliWrap 让C#中的命令行交互(推荐)

希望对您有用! https://github.com/tyrrrz/cliwrap

到此这篇关于使用 cliwrap 让c#中的命令行交互举重若轻的文章就介绍到这了,更多相关c#命令行交互内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!