C#中使用CliWrap让命令行交互举重若轻

在代码中进行命令行交互是一个很常见的场景, 特别是在一些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

到此这篇关于C#中使用CliWrap让命令行交互举重若轻的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#中隐式运行CMD命令行窗口的方法

    MS的CMD命令行是一种重要的操作界面,一些在C#中不那么方便完成的功能,在CMD中几个简单的命令或许就可以轻松搞定,如果能在C#中能完成CMD窗口的功能,那一定可以使我们的程序简便不少. 下面介绍一种常用的在C#程序中调用CMD.exe程序,并且不显示命令行窗口界面,来完成CMD中各种功能的简单方法. 如下所示: 复制代码 代码如下: System.Diagnosties.Process p=new System.Diagnosties.Process(); p.StartInfo.FileN

  • C# 调用命令行执行Cmd命令的操作

    1.不知道为啥 process.StartInfo.Arguments = "/c" + "start D:/Tim/Bin/QQScLauncher.exe"; 这个执行命令一定要加/c ,/c ,/c,重要的事说3遍 才能正常编译并运行 cmd /c dir:是执行完dir命令后关闭命令窗口: cmd /k dir:是执行完dir命令后不关闭命令窗口. process.StartInfo.Arguments 我猜测这个调用的是第一张图的窗口,而不是二图的窗口 代

  • C#从命令行读取参数的方法

    本文实例讲述了C#从命令行读取参数的方法.分享给大家供大家参考.具体如下: using System; class MainClass { public static void Main(string[] args) { foreach (string arg in args) Console.WriteLine("Arg: {0}", arg); } } 将上面的代码保存为:readfile.cs,编辑源文件: csc readfile.cs 执行命令: readfile.exe j

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

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliWarp, 这是一个在 .NET 平台使用的命令行交互工具库, 通过在C# 中使用 Fluent 的API, 让命令行交互举重若轻. https://github.com/Tyrrrz/CliWrap 主要特性如下: 基于 System.Diagnostics.Process 简单, 流畅的 API

  • C#读取命令行参数的方法

    本文实例讲述了C#读取命令行参数的方法.分享给大家供大家参考.具体如下: 下面的代码用于从命令行读取参数,参数个数不定,程序将会输出用户在命令行输入的所有参数列表 using System; namespace W3M { class ArgsExample { public static int Main(string[] args) { for (int i = 0; i < args.Length; i++) { Console.WriteLine(args[i]); } return 0

  • C#/.NET使用git命令行来操作git仓库的方法示例

    我们可以在命令行中操作 git,但是作为一名程序员,如果在大量重复的时候还手动敲命令行,那就太笨了. 本文介绍使用 C# 编写一个 .NET 程序来自动化地使用 git 命令行来操作 git 仓库. 这是一篇很基础的入门文章. 最简单的运行 git 命令的代码 在 .NET 中,运行一个命令只需要使用 Process.Start 开启一个子进程就好了.于是要运行一个 git 命令,我们其实只需要这句足以: Process.Start("git", "status")

  • C#中使用CliWrap让命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliWarp, 这是一个在 .NET 平台使用的命令行交互工具库, 通过在C# 中使用 Fluent 的API, 让命令行交互举重若轻. https://github.com/Tyrrrz/CliWrap 主要特性如下: 基于 System.Diagnostics.Process 简单, 流畅的 API

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

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliWarp, 这是一个在 .NET 平台使用的命令行交互工具库, 通过在C# 中使用 Fluent 的API, 让命令行交互举重若轻. https://github.com/Tyrrrz/CliWrap 主要特性如下: 基于 System.Diagnostics.Process 简单, 流畅的 API

  • IPython 8.0 Python 命令行交互工具

    目录 1.追溯改进 2.自动建议 3.使用“?”和"??"查看对象信息 4.历史范围全局功能 前言: IPython 是 Python 的原生交互式 shell 的增强版,可以完成许多不同寻常的任务,比如帮助实现并行化计算:主要使用它提供的交互性帮助,比如代码着色.改进了的命令行回调.制表符完成.宏功能以及改进了的交互式帮助. IPython 8.0 酝酿了许久,主要对现有代码库和几个新功能进行了改进.新功能包括在 CLI 中使用 Black 重新格式化代码.ghost 建议以及突出错

  • IPython 8.0 Python 命令行交互工具

    目录 1.追溯改进 2.自动建议 3.使用“?”和"??"查看对象信息 4.历史范围全局功能 前言: IPython 是 Python 的原生交互式 shell 的增强版,可以完成许多不同寻常的任务,比如帮助实现并行化计算:主要使用它提供的交互性帮助,比如代码着色.改进了的命令行回调.制表符完成.宏功能以及改进了的交互式帮助. IPython 8.0 酝酿了许久,主要对现有代码库和几个新功能进行了改进.新功能包括在 CLI 中使用 Black 重新格式化代码.ghost 建议以及突出错

  • 详解python中的三种命令行模块(sys.argv,argparse,click)

    Python作为一门脚本语言,经常作为脚本接受命令行传入参数,Python接受命令行参数大概有三种方式.因为在日常工作场景会经常使用到,这里对这几种方式进行总结. 命令行参数模块 这里命令行参数模块平时工作中用到最多就是这三种模块:sys.argv,argparse,click.sys.argv和argparse都是内置模块,click则是第三方模块. sys.argv模块(内置模块) 先看一个简单的示例: #!/usr/bin/python import sys def hello(name,

  • Python 中使用 argparse 解析命令行参数

    目录 1.Python 中的参数解析 2.类型 3.子命令 4.程序架构 使用 argparse 模块为应用程序设置命令行选项. 有一些第三方库用于命令行解析,但标准库 argparse 与之相比也毫不逊色. 无需添加很多依赖,你就可以编写带有实用参数解析功能的漂亮命令行工具. 1.Python 中的参数解析 使用 argparse 解析命令行参数时,第一步是配置一个 ArgumentParser 对象.这通常在全局模块内完成,因为单单_配置_一个解析器没有副作用. import argpars

  • Go语言中使用urfave/cli命令行框架

    命令行参数处理以及urfave/cli使用 1.通过Os.Args获取cli的参数 package main import ( "fmt" "os" ) func main() { if(len(os.Args) > 1) { for _,value := range os.Args{ fmt.Printf( "%v\n",value) } return } fmt.Printf( "%s","没输入参数&qu

  • Python安装使用命令行交互模块pexpect的基础教程

    一.安装 1.安装easy_install工具 wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py 安装easy_install工具(这个脚本会自动去官网搜索下载并安装) python ez_setup.py -U setuptools 升级easy_install工具 2.安装pexpect easy_install Pexpect 测试一下: [root@OMS python]# python Pyth

  • inquirer.js一个用户与命令行交互的工具详解

    写在前面: 开始通过npm init 创建package.json的时候就有大量与用户的交互(当然也可以通过参数来忽略输入):而现在大多数工程都是通过脚手架来创建的,使用脚手架的时候最明显的就是与命令行的交互,如果想自己做一个脚手架或者在某些时候要与用户进行交互,这个时候就不得不提到inquirer.js了. 零. 介绍 由于交互的问题种类不同,inquirer为每个问题提供很多参数: type:表示提问的类型,包括:input, confirm, list, rawlist, expand,

随机推荐