我正在用C#构建一个powershell主机,我想在调用powershell后显示结果。现在我使用以下方法:
public static string GetLogQueriedString(PSMemberInfoCollection<PSPropertyInfo> PSPropertyCollection)
{
string line = string.Empty;
foreach (var item in PSPropertyCollection)
{
if (!line.Equals(string.Empty)) line += ",";
line += item.Name + " : " + item.Value;
}
return line;
}
如果psobject有许多我需要的属性,它会起作用,但在这种情况下,如果PSObject是一个字符串,结果不是我想要的,它将显示“Length:40”,而不是字符串本身。
和另一个问题,如果我执行几个powershell命令,为什么它会显示所有结果,包括前一个结果,例如,我执行“ls; get-process”它将显示“ls”的结果和结果“获得处理”
答案 0 :(得分:4)
我认为我们需要查看更多代码。显示返回的PSObject的典型方法是:
using (var ps = PowerShell.Create()) {
while (true) {
Console.WriteLine("Enter an expression:");
string input = Console.ReadLine();
if (String.IsNullOrWhiteSpace(input)) break;
ps.AddScript(input);
Collection<PSObject> results = ps.Invoke();
foreach (var result in results) {
Console.WriteLine(result);
}
}
}
如果您不需要访问返回对象的属性,而您感兴趣的是格式化文本,请尝试更改此行:
ps.AddScript(input + " | Out-String");
如果您想根据对象类型进行自定义格式设置,则需要根据需要测试类型和格式:
foreach (var result in results) {
var baseObj = result.BaseObject;
if (baseObj is System.Diagnostics.Process)
{
var p = (System.Diagnostics.Process) baseObj;
Console.WriteLine("Handles:{0}, NPM:{1}, PM:{2}, etc", p.HandleCount, p.NonpagedSystemMemorySize, p.PagedMemorySize);
}
else {
Console.WriteLine(result);
}
}
答案 1 :(得分:0)
需要更多代码,但只是对先前答案的澄清.... 将 PSObject LIKE 视为一个数组可能会有所帮助,因为每个值都是一个键值对。因此,如果您尝试显式地强制转换为 ToString
,您将获得对象类型,就像您尝试将数组转换为字符串一样,您将获得内存引用。
一个简单的解决方案是使用 foreach
。对于您的代码:
foreach(var r in results) {
string toConsole = r.ToString()
}
Console.WriteLine(toConsole);