I'm creating a PowerShell cmdlets from Visual Studio and I can't find out how to call cmdlets from within my C# file, or if this is even possible? I have no trouble running my cmdlets one by one, but I want to set up a cmdlet to run multiple cmdlets in a sequel.
Asked
Active
Viewed 7,310 times
8
-
1See also [*Invoking powershell cmdlets from C#*](https://stackoverflow.com/questions/17067971/invoking-powershell-cmdlets-from-c-sharp). – Franklin Yu Nov 20 '18 at 20:58
2 Answers
12
Yes, you can call cmdlets from your C# code.
You'll need these two namespaces:
using System.Management.Automation;
using System.Management.Automation.Runspaces;
Open a runspace:
Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();
Create a pipeline:
Pipeline pipeline = runSpace.CreatePipeline();
Create a command:
Command cmd= new Command("APowerShellCommand");
You can add parameters:
cmd.Parameters.Add("Property", "value");
Add it to the pipeline:
pipeline.Commands.Add(cmd);
Run the command(s):
Collection output = pipeline.Invoke();
foreach (PSObject psObject in output)
{
....do stuff with psObject (output to console, etc)
}
Does this answer your question?

tnw
- 13,521
- 15
- 70
- 111
-
1Shouldn't pipeline.Commands.Add(getProcess); be pipeline.Commands.Add(cmd); - otherwise what looks like a pretty good answer. – simon at rcl Jan 21 '14 at 16:57
-
-
Despite its age this is still a very helpful answer. For those using dotnet core and the CLI, begin with `dotnet add package system.management.automation` to get those namespaces. – Peter Wone Jul 13 '20 at 03:43
-
1Sorry that's not the core package, for Core you need `microsoft.powershell.sdk` – Peter Wone Jul 13 '20 at 04:34
-
1This is to run existing PowerShell cmdlets. Is there a way to run a custom cmdlet (implemented in C#) using automation API? – Ehsan Keshavarzian Nov 29 '21 at 05:16
2
You can use CliWrap Package as an alternative to call PowerShell cmdlets from C# besides using Microsoft.PowerShell.SDK
and System.Management.Automation
.
The benefit of CliWrap Package is you can interact with all external cli not only PowerShell but also Git, NPM, Docker, etc.
For example, you can try this C# code. It will retrieve all Visual Studio processes to the console as if you execute it through command line:
using CliWrap;
using CliWrap.Buffered;
namespace ConsoleApp2
{
public class Program
{
public static async Task Main(string[] args)
{
var dbDailyTasks = await Cli.Wrap("powershell")
.WithArguments(new string[] { "Get-Process", "-Name", "\"devenv\"" })
.ExecuteBufferedAsync();
Console.WriteLine(dbDailyTasks.StandardOutput);
Console.WriteLine(dbDailyTasks.StandardError);
Console.ReadLine();
}
}
}

haryps
- 49
- 1
- 4