在 C# 中平時要執行指令(command)基本上都是透過 Process,但是 Process 使用起來非常複雜,很難上手。今天要來介紹的是筆者已經使用很久的 CliWrap,簡單上手,方便好用。
如果不想要拋出異常,可以使用下面方式設定:
參考資料:
Github - Tyrrrz/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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com