对C#来说相当新,对PowerShell来说并不新鲜。
我想使用C#来执行PowerShell代码。但是,对象的输出与PowerShell窗口中的运行命令不同。我找回了对象的名称,而不是它的数据。这是我正在尝试的内容:
string script = @"
get-process | ft
";
PowerShell powerShell = PowerShell.Create();
powerShell.AddScript(script);
var results = powerShell.Invoke();
foreach (var item in results)
{
Console.WriteLine(item);
}
返回:
Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
但是,在PowerShell命令行窗口中,它返回一个更合理的表视图:
PS C:\ Dropbox \ PowerShell> ps |英尺
处理NPM(K)PM(K)WS(K)VM(M)CPU(s)Id SI ProcessName ------- ------ ----- ----- ----- ------ - - ----------- 131 12 1980 2572 85 0.45 13216 1 acrotray
真的想要两件事:
提前致谢!
答案 0 :(得分:3)
我想通了,感谢codeproject上的代码示例,我发现命令“out-string”需要添加到所有命令的末尾。所以要添加的额外代码是:
ps.AddCommand( “OUT-字符串”);
我想知道控制台是否只是这样做,或者是否还有更多内容。
答案 1 :(得分:0)
PowerShell使用自己的XML格式文档在控制台和ISE中返回表格样式输出。 Out-String是这种格式在你的情况下发挥作用的地方,因为它将保留格式(你可以使用' -Stream'切换为out字符串以在执行时返回每一行)。
可以从传回C#的对象中提取信息,而不使用out-string;但是,根据我的经验,如果你只是显示这些信息;这是返回字符串的最佳选择。但是,如果需要对对象执行其他处理,则可以返回一个对象,然后根据要处理的对象类型执行条件。例如,如果我需要在从PowerShell返回后操作对象(不使用' out-string'),我使用以下内容:
System.Diagnostic.Process是Get-Process命令中返回的对象类型 - 确保您确切知道要传递回C#的对象类型
using (PowerShell psRunspace = PowerShell.Create())
{
psRunspace.AddCommand("Get-Process");
psRunspace.AddParameter("ComputerName", computerName);
Collection<PSObject> outputObj = psRunspace.Invoke();
foreach (PSObject obj in outputObj)
{
var objProperties = obj.Properties;
var objMethods = obj.Methods;
var baseObj = obj.BaseObject;
if (baseObj is System.Diagnostic.Process)
{
var p = (System.Diagnostic.Process)baseObj;
//you can now access all members of this object normally
//Do something here with p.Properties or p.Methods etc...
}
}
我也建议,因为我在你的问题中没有看到它,考虑使用&#39;使用&#39;用于执行powershell命令的语句。这将为您打开和关闭管道/运行空间。在您的示例中,除非您从示例代码中省略它,否则您似乎无法关闭该管道。此外,在您的invoke命令中特别指出您为要返回的对象使用适当的类型,并使用上面显示的Collection和您要返回的对象类型(PSObject)。