我正在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()
在执行时占用大部分时间。
答案 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
并对其进行格式化。