SimpleExec
SimpleExec是一个用于运行外部命令的.NET库。它封装了System.Diagnostics.Process
以简化使用。
SimpleExec有意不调用系统shell。
平台支持:.NET 6.0及更高版本。
快速入门
using static SimpleExec.Command;
Run("foo", "arg1 arg2");
运行
Run("foo");
Run("foo", "arg1 arg2");
Run("foo", new[] { "arg1", "arg2" });
await RunAsync("foo");
await RunAsync("foo", "arg1 arg2");
await RunAsync("foo", new[] { "arg1", "arg2" });
默认情况下,命令会被回显到标准输出(stdout)以提高可见性。
读取
var (standardOutput1, standardError1) = await ReadAsync("foo");
var (standardOutput2, standardError2) = await ReadAsync("foo", "arg1 arg2");
var (standardOutput3, standardError3) = await ReadAsync("foo", new[] { "arg1", "arg2" });
其他可选参数
string workingDirectory = "",
bool noEcho = false,
string? echoPrefix = null,
Action<IDictionary<string, string?>>? configureEnvironment = null,
bool createNoWindow = false,
Encoding? encoding = null,
Func<int, bool>? handleExitCode = null,
string? standardInput = null,
bool cancellationIgnoresProcessTree = false,
CancellationToken cancellationToken = default,
异常
如果命令的退出代码非零,将抛出一个ExitCodeException
异常,该异常包含一个int
类型的ExitCode
属性,以及以下形式的消息:
$"进程以代码{ExitCode}退出。"
对于ReadAsync
,将抛出一个ExitCodeReadException
异常,该异常继承自ExitCodeException
,并具有string
类型的Out
和Error
属性,分别表示标准输出(stdout)和标准错误(stderr),以及以下形式的消息:
$@"进程以代码{ExitCode}退出。
标准输出:
{Out}
标准错误:
{Error}"
覆盖默认退出代码处理
大多数程序在成功时返回零退出代码,失败时返回非零退出代码。然而,有些程序在成功时返回非零退出代码。例如,Robocopy在成功时返回小于8的退出代码,失败时返回大于等于8的退出代码。
可以通过向handleExitCode
传递一个委托来抑制特定非零退出代码的异常抛出。当委托处理了退出代码并应抑制默认退出代码处理时,返回true
;否则返回false
。
例如,在运行Robocopy时,应该为小于8的退出代码抑制异常抛出:
Run("ROBOCOPY", "from to", handleExitCode: code => code < 8);
请注意,记录退出代码可能很有用。例如:
var exitCode = 0;
Run("ROBOCOPY", "from to", handleExitCode: code => (exitCode = code) < 8);
// 参见 https://ss64.com/nt/robocopy-exit.html
var oneOrMoreFilesCopied = exitCode & 1;
var extraFilesOrDirectoriesDetected = exitCode & 2;
var misMatchedFilesOrDirectoriesDetected = exitCode & 4;
Run 由 Gregor Cresnar 提供,来自 the Noun Project。