任何更快的Powershell.Invoke解决方案?

时间:2013-11-07 13:52:50

标签: c# json powershell

我正在C#中编写CmdLet并使用Powershell-Class 并调用不同的命令。我的代码在这里:

PowerShell poswershell;
public Construcor()
{
     powershell = PowerShell.Create()
}
public Collection<PSObject> InvokeRestMethod(string uri)
{
    return InvokePSCommand("Invoke-RestMethod", new[] { uri });
}

public Collection<PSObject> InvokePSCommand(string command, string[] args)
{
    var execute = command;
    execute = GetExecuteCommand(args, execute);
    powershell.Commands.AddScript(execute);
    return powershell.Invoke();

}

private static string GetExecuteCommand(string[] args, string execute)
{
    if (args == null) return execute;
    for (var i = 0; i < args.Count(); i++)
    {
        execute += " " + args[i];
    }
    return execute;
}

它的工作方式与我想要的一样,但确实很慢。我想要相同的功能,它给了我一个Collection<PSObject>。但是当我多次拨打InvokeRestMehtod时,需要很长时间才能通过这个问题。 为什么我只是为了一个简单的WebRequest而使用它? 答案是,我必须从uri(返回json)中读取一些信息。事实是json结构总是不同的。因此Invoke-RestMehtod完全满足我的需要,一个动态对象(PSObject)。我必须有这种对象,因为在那个过程之后我需要在powershell用户中给出这个,所以他可以管道对象并使用它。 我现在的问题是,我怎样才能从返回json的uri获得相同的结果,我可以将其传递给powershell?

修改

我发现这个dll =&gt; Microsoft.PowerShell.Commands.Utility.dll,它在C#代码中包含InvokeRestMethod - CmdLet powershell所调用的内容。如果我能很好地阅读这段代码,我可以(将)在我的代码中使用它。然后,我不会创建一个PowerShell实例,并从我的powershell-CmdLet调用另一个CmdLet,我不太喜欢并且花费太长时间。有人知道这个dll,可以帮我为我的项目自定义这个代码吗?

我找到dottrace并分析了这个过程,这里有一个screenshot我无法从中得到任何有用的信息,也许是你的某个人?但我很确定Powershell.Invoke()在执行时占用大部分时间。

2 个答案:

答案 0 :(得分:2)

为什么不重复使用相同的PowerShell对象而不是每次都创建一个新对象?每个实例化都会导致PowerShell再次初始化。请务必在Invoke()调用之间调用powershell.Commands.Clear()。

答案 1 :(得分:0)

我现在解决了这个问题,这里是读取uri的基本代码(返回JSON)并返回object

  private object InvokeRest(string uri)
    {
        return InvokeRest(uri, null);
    }
    private object InvokeRest(string uri, NetworkCredential networkCredential)
    {
        var webRequest = WebRequest.Create(uri);
        if (networkCredential!=null)
            webRequest.Credentials = networkCredential;
        _webResponse = webRequest.GetResponse();
        var streamReader = new StreamReader(_webResponse.GetResponseStream());
        var str = streamReader.ReadToEnd();
        ErrorRecord exRef;
        var doc = JsonObject.ConvertFromJson(str, out exRef);
        return doc;
    }

因为我发现您在powershell中输出的每个object,都会转换为PSObject并对其进行格式化。