首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell.Invoke有更快的解决方案吗?

Powershell.Invoke有更快的解决方案吗?
EN

Stack Overflow用户
提问于 2013-11-07 13:52:49
回答 2查看 2.2K关注 0票数 1

我正在用CmdLet编写一个C#,使用Powershell-类并调用不同的命令。在这里,我的守则:

代码语言:javascript
运行
复制
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=> Microsoft.PowerShell.Commands.Utility.dll,它在C#代码中包含了被powershell称为InvokeRestMethod-CmdLet。如果我能很好地阅读这段代码,我就可以在我的代码中使用它。然后我就不会创建一个PowerShell实例并从我的powershell-CmdLet调用另一个CmdLet,我不太喜欢它,而且花费的时间太长。有人知道这个dll,并能帮助我为我的项目定制这个代码吗?

我找到了斑点迹并分析了这个过程,这里有一个屏幕截图,我无法从中得到任何有用的信息,也许是你的某个人?但我非常肯定,Powershell.Invoke()在执行时占用了大部分时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-11 11:55:30

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

代码语言:javascript
运行
复制
  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并对其进行格式化。

票数 0
EN

Stack Overflow用户

发布于 2013-11-07 17:07:46

为什么不重用同一个PowerShell对象而不是每次创建一个新的对象?每次实例化都会使PowerShell不得不再次初始化。只需确保在调用()调用之间调用powershell.Commands.Clear()。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19837701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档