使用 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


猜你喜欢
- 本文实例为大家分享了Java实现24点小游戏的具体代码,供大家参考,具体内容如下程序设计要求:24点游戏是经典的纸牌益智游戏。常见游戏规则:
- 本文研究的主要是Java面试题中的一个比较常见的题目,判断及防止SQL注入的问题,具体介绍如下。SQL注入是目前黑客最常用的攻击手段,它的原
- 目录I. 环境配置1. 项目配置2. 数据库表II. 传参类型确定1. 参数类型为整形2. 指定jdbcType3. 传参类型为String
- 本文实例为大家分享了JavaWeb实现用户登录与注册功能的具体代码,供大家参考,具体内容如下用到的知识客户端:HTML CSS JS (JQ
- <?xml version="1.0" encoding="UTF-8" ?> <
- 1.概述当Java 8发布时,其中最令人兴奋的特性之一就是 Lambda 表达式。Lambda 表达式是一种轻量级、简洁和高效的函数式编程方
- 从今天开始写关于C#的系列文章,本篇文章主要讲解C#中的委托使用。委托其实就是一种数据类型,和int,string是一样的概念。如果要把一个
- 单例模式的实现(5种)常用:饿汉式(线程安全,调用效率高,但是不能延时加载)懒汉式(线程安全,调用效率不高,可以延时加载)其他:双重检测锁式
- 一、前言WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现。我们先看一下IP地址输入控件有什么特性:输满三个数字焦点会往右移键盘←
- ListView 和ScroolView同时使用计算高度时onmeasure报空指针的解决办法前言:虽然Android 的设计者始终认为Li
- 1、背景最近用到了Spring Cloud Alibaba开发微服务,在开发的过程中发现,当我们的服务上线或下线的时候,我们的Spring
- 之前写了一个WPF的圆形环绕的Loading动画,现在写一个Winform的圆形环绕的Loading动画。1.新建Winform项目,添加一
- 一、spring定时任务执行两次问题重现和解析最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时
- C#函数返回多个参数数值通过out/Ref实现,声明函数时用out指定返回变量。写了一个DEMO,输入字符“测试字符&a
- 随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新
- 一、概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多
- 在需要线程同步的时候如何选择合适的线程锁?例:选择可以存入到常量池当中的对象,String对象等public class SyncTest{
- 接上文Spring Cloud下基于OAUTH2认证授权的实现,我们将基于Spring Cloud实现OAUTH2的注销功能。1 增加自定义
- 本文为大家分享了自己写的一个Pager分页组件,WebForm,Mvc都适用,具体内容如下分页控件其实就是根据链接在页面间传递参数,因为我看
- 一、volatile作用可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间的重排序二、什么是可见性可见性是指当一个线程对于