8

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.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Bjorn
  • 723
  • 2
  • 11
  • 29
  • 1
    See 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 Answers2

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
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