Bjorn
Bjorn

Reputation: 733

How to call PowerShell cmdlets from C# in Visual Studio

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.

Upvotes: 9

Views: 9104

Answers (2)

haryps
haryps

Reputation: 49

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();
        }
    }
}

Upvotes: 2

tnw
tnw

Reputation: 13887

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?

Upvotes: 14

Related Questions