Powershell Invoke方法既不抛出异常也不返回结果

时间:2016-01-19 11:46:02

标签: powershell automation

我正在尝试构建一个ASP.Net,c#应用程序,通过Web界面为分布式Admin组公开一些与IIS管理相关的活动。

我正在使用System.Management.Automation V3.0库来包装power shell命令。作为第一步,我想通过调用Get-WebApplication命令列出当前在本地IIS上运行的所有Web应用程序。 这是我面临的问题。方法调用既不抛出任何异常,也不返回结果。有谁知道这个问题的根本原因?请分享您使用System.Management.Automation.dll构建此类界面的经验。

 var shell = PowerShell.Create();              
          shell.Commands.AddScript("Get-WebApplication | Out-String");
          try
          {
              var results = shell.Invoke();
              if (results.Count > 0)
              {
                  var builder = new StringBuilder();
                  foreach (var psObject in results)
                  {                          
                      builder.Append(psObject.BaseObject.ToString() + "\r\n");
                  }
              }

          }                  
          catch(Exception ex)
          {
              throw;
          }

PS:取代Get-WebApplication的Get-Service通过返回机器上可用的服务列表完全正常。

1 个答案:

答案 0 :(得分:0)

PowerShell.Create()不会创建新的PowerShell进程。如果您没有为其指定Runspace,那么它将创建新的进程中Runspace。由于它在您的过程中运行,它将匹配您的过程位数,您无法更改它。要创建具有不同位数的Runspace,您需要创建流程外Runspace。这是一个示例控制台应用程序,演示了如何执行此操作:

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
public static class TestApplication {
    public static void Main() {
        Console.WriteLine(Environment.Is64BitProcess);
        using(PowerShellProcessInstance pspi = new PowerShellProcessInstance()) {
            string psfn = pspi.Process.StartInfo.FileName;
            psfn=psfn.ToLowerInvariant().Replace("\\syswow64\\", "\\sysnative\\");
            pspi.Process.StartInfo.FileName=psfn;
            using(Runspace r = RunspaceFactory.CreateOutOfProcessRunspace(null, pspi)) {
                r.Open();
                using(PowerShell ps = PowerShell.Create()) {
                    ps.Runspace=r;
                    ps.AddScript("[Environment]::Is64BitProcess");
                    foreach(PSObject pso in ps.Invoke()) {
                        Console.WriteLine(pso);
                    }
                }
            }
        }
    }
}

如果您将此应用程序编译为x32,它仍将在x64操作系统上使用x64进程Runspace