【问题标题】:C# Invoke powershell "Get-Website" always return emptyC# Invoke powershell "Get-Website" 总是返回空
【发布时间】:2020-04-01 08:38:29
【问题描述】:

我正在尝试使用 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 调用其他东西,并且总是可以正常工作

【问题讨论】:

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


    【解决方案1】:

    需要检查的几件事:

    你实例化了一个 stringbuilder 但从不使用它

    StringBuilder stringBuilder = new StringBuilder();
    

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

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

    因此,如果您的 websiteName 从未从 Get-Website 获得结果,您将始终拥有一个没有按预期设置属性的对象。如果您从 Get-Website 获得结果,您只会从最后一个迭代对象中获得一些来自 BaseObject.ToString() 的东西。在尝试分配值之前,您可能需要多做一点检查是否得到了一些东西。

    更新到 cmets

    你可能想要像这样构建你的字符串

    ps.Commands.AddScript($"Get-Website -Name {websiteName} | %{{$_.state}}");
    

    我不确定您是否可以像在 powershell 中期望的那样访问管道结果。所以也许可以尝试将数组存储在您在脚本中显式返回的 OutVariable 中。

    【讨论】:

    • 你是对的,但无论如何,如果我在“Collection results = ps.Invoke();”上调试这个 ps.invoke 在必须得到结果时返回空数据
    • 我会查看行 ps.Commands.AddScript(@"Get-Website -Name """ + websiteName + @""" | %{$_.state}");它是否会创建一个 coorect 脚本以传入并稍后调用。
    • 但是如果我尝试其他的东西,比如 ps.Commands.AddScript(@"Get-Acl");它返回值。问题刚刚发生在“Get-Website”
    • 您是否将参数传递给其他命令或尝试像 ypu 显示的代码那样通过管道传输命令?您还需要考虑脚本是否能够在您调用它的地方运行以及如何调用它。该命令是否需要不同的权限才能运行,然后您的代码会运行它。确定是否得到预期结果的最简单方法是在 powershell cmd(不是 ISE !!!)中运行代码,如果运行成功,请先尝试在不使用管道的情况下传递它,然后检查从中获得的结果
    • 计算机科学界的许多聪明人都给了我们关于如何解决问题的建议,其中之一就是逐步解决问题,所以从一个简单的获取网站开始,按照自己的方式工作直到通过管道输出获得结果
    【解决方案2】:

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

    【讨论】:

    • 有一天你可能会遇到更多不同,blog.lextudio.com/… 所以了解执行上下文非常重要。
    • 我要求您将解决方案标记为答案,它将帮助面临类似问题的其他人。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2019-03-08
    相关资源
    最近更新 更多