MedallionShell is a lightweight library that vastly simplifies working with processes in .NET apps.
Built on top of the powerful, yet clunky System.Diagnostics.Process API, the MedallionShell API streamlines common use-cases, removes pitfalls, and integrates Process handling with .NET async/await and Tasks.
// processes are created and interacted with using the Command class
var cmd = Command.Run("path_to_grep", "some REGEX");
cmd.StandardInput.PipeFromAsync(new FileInfo("some path"));
// by default, all output streams are buffered, so there's no need to worry
// about deadlock
var outputLines = cmd.StandardOutput.GetLines().ToList();
var errorText = cmd.StandardError.ReadToEnd();
// by default, the underlying Process is automatically disposed
// so no using block is required
// and complex arguments are automatically escaped
var cmd = Command.Run("path_to_grep", "\\ some \"crazy\" REGEX \\");
// we can also do this inline using bash-style operator overloads
var lines = new List<string>();
var cmd = Command.Run("path_to_grep", "some REGEX") < new FileInfo("some path") > lines;
cmd.Wait();
// and we can even chain commands together with the pipe operator
var pipeline = Command.Run("path_to_grep", "some REGEX") | Command.Run("path_to_grep", "another REGEX");
// we can check a command's exit status using it's result
if (cmd.Result.Success) { ... }
// and perform async operations via its associated task
await cmd.Task;
// commands are also highly configurable
var cmd = Command.Run(
"path_to_grep",
new[] { "some REGEX" },
options: o => o
// arbitrarily configure the ProcessStartInfo
.StartInfo(si => si.RedirectStandardError = false)
// option to turn a non-zero exit code into an exception
.ThrowOnError()
// option to kill the command and throw TimeoutException if it doesn't finish
.Timeout(TimeSpan.FromMinutes(1))
...
);
// and if we want to keep using a common set of configuration options, we
// can package them up in a Shell object
var shell = new Shell(o => o.ThrowOnError()...);
shell.Run("path_to_grep", "some REGEX");