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.
2 Answers
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?
5 Comments
dotnet add package system.management.automation to get those namespaces.microsoft.powershell.sdkYou 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();
}
}
}