我正在尝试使用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调用其他东西,并且总是可以正常工作
答案 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中起作用,这就是为什么总是返回空的原因