C#调用powershell“ Get-Website”总是返回空

时间:2019-12-07 17:36:55

标签: c# asp.net powershell iis web-testing

我正在尝试使用Powershell从C#中读取IIS本地网站 但是我总是得到一个空的输出

public static ManageWebsite GetWebSiteStatus(string websiteName)
{

    ManageWebsite websiteState = new ManageWebsite();
    Runspace runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();

    PowerShell ps = PowerShell.Create(); // Create a new PowerShell instance
    ps.Runspace = runspace; // Add the instance to the runspace
    ps.Commands.AddScript(@"Get-Website -Name """ + websiteName + @""" | %{$_.state}"); // Add a script

    Collection<PSObject> results = ps.Invoke();
    string powershell_output = string.Empty;

    runspace.Close();

    StringBuilder stringBuilder = new StringBuilder();
    foreach (PSObject obj in results)
    {
        powershell_output = obj.BaseObject.ToString();

    }

    websiteState.Status = powershell_output;
    websiteState.WebSite = websiteName;
    return websiteState;
}

我不知道为什么,我总是使用该函数在C#中使用powershell调用其他东西,并且总是可以正常工作

2 个答案:

答案 0 :(得分:0)

要检查的几件事:

您实例化一个stringbuilder,但从不使用它

@IBAction func sum(_ sender: Any) {

      let one = input1.text
      let oneInt = Int(one!)
      let two = input2.text
      let twoInt = Int(two!)
      let total = oneInt! + twoInt!
      label.text = "\(total)"

    if(input2.text == nil){
        addBtn.isEnabled = false
    }
    if(input1.text == nil){
        addBtn.isEnabled = false
    }
  }

您将变量设置为空字符串,这没关系,但是每次遍历对象时都将其覆盖。如果您从未得到对象,它仍然是一个空字符串!然后您将其分配给Status websiteState.Status。

StringBuilder stringBuilder = new StringBuilder();

因此,如果您的websiteName从未从Get-Website获得结果,则您将始终具有未按预期设置属性的对象。如果从Get-Website获得结果,则只能从最后一个迭代对象中获得一些东西,形式是BaseObject.ToString()。在尝试分配值之前,您可能还需要再检查一下是否还可以得到一些东西。

更新为评论

您可能希望像这样构建字符串

   string powershell_output = string.Empty; 
   foreach (PSObject obj in results)
   {
       powershell_output = obj.BaseObject.ToString();
   }

   websiteState.Status = powershell_output;

,我不确定您是否可以像在Powershell中期望的那样访问管道结果。因此,也许尝试将数组存储在OutVariable中,以便在脚本中返回explict。

答案 1 :(得分:0)

谢谢大家。 我知道我是个白痴。我的代码ps.Commands.AddScript(@“ Get-Website -Name”“” + websiteName + @“”“ |%{$ _。state}”)); //添加脚本 在IIS Express中起作用,这就是为什么总是返回空的原因