Recently, with the release of System Center Virtual Machine Management 2012 SP1, more and more people are joining the development of private cloud, especially the development and testing cloud, however, technical documents and materials in China are quite scarce. A foreign colleague asked "How to Use C # To Call PowerShell and obtain the return value" a few days ago.
The solution is as follows:
- You can call the system PowerShell by using the following code:
/// <summary> /// invoke system powershell /// </summary> /// <param name="cmd"></param> public static void InvokeSystemPS(string cmd) { List<string> ps = new List<string>(); ps.Add("Set-ExecutionPolicy RemoteSigned"); ps.Add("Set-ExecutionPolicy -ExecutionPolicy Unrestricted"); ps.Add("& " + cmd); Runspace runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); Pipeline pipeline = runspace.CreatePipeline(); foreach (var scr in ps) { pipeline.Commands.AddScript(scr); } pipeline.Invoke();//Execute the ps script runspace.Close(); }
2. Call the VMM product. Here we use "Get-VM-Name vm001" as an example:
/// <summary> /// Invoke VMM Poershell /// </summary> public static void InvokeVMMPS() { RunspaceConfiguration rconfig = RunspaceConfiguration.Create(); PSSnapInException Pwarn = new PSSnapInException(); Runspace runspace = RunspaceFactory.CreateRunspace(); string test = "Import-Module VirtualMachineManager\r\n"; runspace = RunspaceFactory.CreateRunspace(rconfig); runspace.Open(); Pipeline pipeline = runspace.CreatePipeline(); pipeline.Commands.AddScript(test); try { var results = pipeline.Invoke(); using (Pipeline pipe = runspace.CreatePipeline()) { //Get-VM -Name vm001 Command cmd = new Command("Get-VM"); cmd.Parameters.Add("Name", "vm001"); pipe.Commands.Add(cmd); var result = pipe.Invoke(); } } catch (Exception ex) { throw ex; } }
Firstly, you need to add reference "System. Management. Automation". Then, add two name space:
Using System. Management. Automation. Runspaces;
Using System. Management. Automation;