我正在用CmdLet编写一个C#,使用Powershell-类并调用不同的命令。在这里,我的守则:
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()在执行时占用了大部分时间。
发布于 2013-11-11 11:55:30
我现在解决了这个问题,下面是读取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并对其进行格式化。
发布于 2013-11-07 17:07:46
为什么不重用同一个PowerShell对象而不是每次创建一个新的对象?每次实例化都会使PowerShell不得不再次初始化。只需确保在调用()调用之间调用powershell.Commands.Clear()。
https://stackoverflow.com/questions/19837701
复制相似问题