我一直在制作运行一些Powershell东西的C#应用程序,问题是它似乎没有收集Powershell命令的正确/全部结果。
以下代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
List<string> results = RunScript("Get-ADUser testuser2 -Properties *");
this.ShowMessageAsync("OK",results[0]);
}
private List<string> RunScript(string comand)
{
var powerShell = PowerShell.Create();
powerShell.Runspace = runspace;
powerShell.AddScript(comand);
Collection<PSObject> results = powerShell.Invoke();
List<string> resultsList = new List<string>();
if (powerShell.Streams.Error.Count > 0)
{
this.ShowMessageAsync("Something went wrong!", "Check error log for details!");
runspaceBox.AppendText(powerShell.Streams.Error[0] + "\r\n");
}
else
{
foreach (PSObject obj in results)
{
runspaceBox.AppendText(obj.ToString() + "\r\n");
resultsList.Add(obj.ToString());
}
}
return resultsList;
}
结果:
{CN = testuser2,DC = TESTDOMAIN,DC = COM}
将命令直接放入Powershell会产生以下结果:
PS C:\ Users \ Ultimate-V1&gt; Get-ADUser testuser2 -Properties *
[上面有一堆额外的东西]
描述:
DisplayName:Test User2
DistinguishedName:CN = Test 之一,CN =用户,DC = TESTDOMAIN,DC = COM
分部:
DoesNotRequirePreAuth:False
[下面有很多额外的东西]
我已经从上面的命令中剪掉了很多结果,因为它很长。
我能解决的问题是为什么它只返回专有名称而不是所有结果,这种情况发生在一些命令而不是其他命令。例如,返回用户上所有AD组的命令正常工作。
如果可能的话,我喜欢它拥有该命令返回的所有内容,我将在代码中稍后格式化resultsList。
非常感谢任何帮助或指示!
答案 0 :(得分:1)
因为您将结果作为字符串转换,所以您获得了复杂对象的字符串表示(无论对象的.ToString()
方法的结果如何)。
在PowerShell本身中,它不会将所有内容都转换为字符串来显示它;它有关于如何一般显示对象的各种规则(通常是表格或列表格式),有些类型有特定的格式化程序。
PetSerAl已在评论中回答,但获取PowerShell在控制台上显示的字符串表示的方法是通过Out-String
发送输出:
powerShell.AddScript(comand).AddCommand("Out-String");