C# 使用 CliWrap 套件快速執行指令

在 C# 中平時要執行指令(command)基本上都是透過 Process,但是 Process 使用起來非常複雜,很難上手。今天要來介紹的是筆者已經使用很久的 CliWrap,簡單上手,方便好用。

安裝

先使用 NuGet 安裝 CliWrap 套件,或是使用 .NET CLI 執行以下指令安裝
	
dotnet add package CliWrap
    

基本用法

直接執行

    
var result = Cli.Wrap("explorer") // 指令
    .WithArguments(new[] { @"C:\Users\ruyut\Documents" }) // 參數
    .ExecuteAsync();
    
Console.WriteLine($"結束代號: {result.ExitCode}");
Console.WriteLine($"開始時間: {result.StartTime}");
Console.WriteLine($"結束時間: {result.ExitTime}");
Console.WriteLine($"執行花費時間: {result.RunTime}");
/*
結束代號: 0
開始時間: 2023/4/5 下午 11:59:59 +08:00
結束時間: 2023/4/5 下午 11:59:59 +08:00
執行花費時間: 00:00:00.0867652
*/
    

取得執行結果

    
var standardOutputBuffer = new StringBuilder();
var standardErrorBuffer = new StringBuilder();

var result = await Cli.Wrap("docker")
    .WithArguments(new []{"ps", "-a"})
    .WithStandardOutputPipe(PipeTarget.ToStringBuilder(standardOutputBuffer)) // 成功時輸出
    .WithStandardErrorPipe(PipeTarget.ToStringBuilder(standardErrorBuffer)) // 失敗時輸出
    .ExecuteAsync();

var standardOutput = standardOutputBuffer.ToString();
var standardError = standardErrorBuffer.ToString();

Console.WriteLine($"成功輸出: {standardOutput}");
Console.WriteLine($"錯誤輸出: {standardError}");
    

設定執行失敗不拋出異常

如果執行的程式退出時代號不為 0 ,則會拋出異常錯誤,類似於:
    
Command:
docker ps -a

You can suppress this validation by calling `WithValidation(CommandResultValidation.None)` on the command.
   at CliWrap.Command.ExecuteAsync(ProcessEx process, CancellationToken forcefulCancellationToken, CancellationToken gracefulCancellationToken) in D:\a\CliWrap\CliWrap\CliWrap\Command.Execut
ion.cs:line 237
   at CliWrap.Command.ExecuteAsync(ProcessEx process, CancellationToken forcefulCancellationToken, CancellationToken gracefulCancellationToken) in D:\a\CliWrap\CliWrap\CliWrap\Command.Execut
ion.cs:line 251
   at CliWrap.Command.ExecuteAsync(ProcessEx process, CancellationToken forcefulCancellationToken, CancellationToken gracefulCancellationToken) in D:\a\CliWrap\CliWrap\CliWrap\Command.Execut
ion.cs:line 251
   at Program.<Main>$(String[] args) in C:\Users\ruyut\Documents\RiderProjects\2023\test\ConsoleAppCliWrapTest\ConsoleAppCliWrapTest\Program.cs:line 7
   at Program.<Main>(String[] args)
    

如果不想要拋出異常,可以使用下面方式設定:
    
var result = await Cli.Wrap("docker")
    .WithArguments(new []{"ps", "-a"})
    .WithValidation(CommandResultValidation.None) // 變更為不拋出異常
    .ExecuteAsync();
    

設定環境變數

方法一

    
var result = await Cli.Wrap("git")
    .WithEnvironmentVariables(env => env // 設定環境變數
        .Set("GIT_AUTHOR_NAME", "ruyut")
        .Set("GIT_AUTHOR_EMAIL", "a@ruyut.com")
    )
    .ExecuteAsync();
    

方法二

    
var result = await Cli.Wrap("git")
    .WithEnvironmentVariables(new Dictionary<string, string?>
    {
        ["GIT_AUTHOR_NAME"] = "John",
        ["GIT_AUTHOR_EMAIL"] = "john@email.com"
    })
    .ExecuteAsync();
    



參考資料:
Github - Tyrrrz/CliWrap

留言