用C# 调用PowerShell 3.0

       最近,随着System Center Virtual Machine Management 2012 SP1 的发布,越来越多的人,加入到私有云的开发中来,特别是,开发测试云,但国内的技术文档及资料相当匮乏。前几天,一个外地的同事在问 “怎么用C# 调用PowerShell并且取得返回值”的问题。

解决方案如下:

  1. 调用系统的PowerShell,可以用: 
 /// <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.调用VMM产品,这里以“Get-VM -Name vm001” 为例:

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

 

posted @ 2012-12-17 14:54  tomin  阅读(7505)  评论(3编辑  收藏  举报