使用 CliWrap 让C#中的命令行交互(推荐)
作者:SpringLeee 发布时间:2023-04-19 01:31:51
在代码中进行命令行交互是一个很常见的场景, 特别是在一些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;
}
}
输出结果如下:
希望对您有用! https://github.com/Tyrrrz/CliWrap
来源:https://www.cnblogs.com/myshowtime/p/15654334.html
猜你喜欢
- 前言去年7月时,在Github发布了一个开源的Banner库,虽然Star不多,但还是有少部分人使用。Banner效果:Github链接地址
- 前言分页是我们在开发中绕不过去的一个坎!当你的数据量大了的时候,一次性将所有数据查出来不现实,所以我们一般都是分页查询的,减轻服务端的压力,
- 下面将源代码贴出。 public static class ChineseToPinYin { private static readonl
- 介绍细心的小伙伴可能会发现,抖音新上线了IP属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的IP属地信息下面,我就来讲讲
- 本文实例讲述了java数据结构与算法之双向循环队列的数组实现方法。分享给大家供大家参考,具体如下:需要说明的是此算法我并没有测试过,这里给出
- 本文实例为大家分享了C#十五子游戏的具体代码,供大家参考,具体内容如下using System;using System.Collectio
- 创建一个类,在该类的主方法中创建标准输入流的扫描器对象,提示用户输入一个整数,并通过扫描器的方法来接受这个整数,然后通过三元运算符判断该数字
- 一、前言在一些对高并发请求有限制的系统或者功能里,比如说秒杀活动,或者一些网站返回的当前用户过多,请稍后尝试。这些都是通过对同一时刻请求数量
- 前言Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。(负载均衡+RestTempl
- 之前做过用java读取word文档,获取word文本内容。但发现docx的支持,doc就异常了。后来找了很多资料发现是解析方法不一样。首先要
- 以下内容给大家介绍Android数据存储提供了五种方式:1、SharedPreferences2、文件存储3、SQLite数据库4、Cont
- 1、装箱和拆箱是一个抽象的概念 2、装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型利用装箱和拆箱功能,可通过允许值类型的任何值
- 前言Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些AP
- 本文实例讲述了C#面向对象编程之猜拳游戏实现方法。分享给大家供大家参考。具体实现方法如下:1.需求现在要制作一个游戏,玩家与计算机进行猜拳游
- 一、什么是MVP在网上找了些资料,整理如下:MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中
- 前言Java线程池中提交任务运行,通常使用execute()方法就足够了。那如果想要实现在主线程中阻塞获取线程池任务运行的结果,该怎么办呢?
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- 本文实例为大家分享了C#实现银行家算法的具体代码,供大家参考,具体内容如下1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中
- redis实现了对数据的缓存,在项目里一些字典数据,会话数据,临时性数据都会向redis来存储,而在springboot里对redis也有支
- 1、数组数组的引用传递public class TestDemo1{public static void main(String args[