【问题标题】:How to iterate through BaseObject property of PSObject in C#如何在 C# 中遍历 PSObject 的 BaseObject 属性
【发布时间】:2021-09-24 11:57:36
【问题描述】:

我有一个 PSObject 项目列表,这些项目是在使用 System.Management.Automation 包时调用 .Invoke() 方法时返回的。在调试它时,我可以在BaseObjectImmediateBaseObject 属性中看到要打印的对象的值。但是,使用foreach 循环遍历结果,并打印每个项目的BaseObjects 只会打印项目的类型(System.Collections.ArrayList)。如何将 BaseObjects 的值存储到变量中?

这是代码和一些截图:

using (var ps = PowerShell.Create())
{
    var results = ps.AddScript(File.ReadAllText(@".\PSScripts\test_func2.ps1")).Invoke();
    foreach (PSObject result in results)
    {
        if (result != null)
        {
             outList.Add(result.BaseObject.ToString())
        }
    }
}

这是调试期间的results 对象,它只有相关数据的数组。由于隐私原因隐藏。

这是调试期间的result 对象> BaseObject 视图。 result 对象的 members 属性没有相关数据。

这是我在执行上述代码时得到的输出:

提前致谢。

【问题讨论】:

  • 如果您希望接收自定义对象而不是 ArrayLists,您需要查看您的 ps1 脚本并修改它以返回对象
  • 谢谢丹尼尔。我解决了这个问题,但这似乎是更好的方法。事情是,我已经从脚本中返回了一个基本类型 System.Array 的对象数组。我能改变什么?
  • 我必须查看您的 ps1 脚本才能了解您如何输出数组列表而不是对象的集合。您可以使用该代码发布一个新问题,询问如何将输出从数组列表更改为对象以获得进一步的帮助。无论哪种方式,为您找到解决问题的方法感到高兴。 :)

标签: c# powershell system.management


【解决方案1】:

我通过创建一个IList 对象并将我的result 对象转换为IList 解决了这个问题。然后我可以遍历 IList 变量的值。这里,res 是一个 List<String[]> 对象,声明为函数级范围,可以保存 results 对象的所有值。

List<string> temp = new List<string>();
IList collection = (IList)result.BaseObject;
foreach(var x in collection)
{
    temp.Add((string)x);
}
res.Add(temp.ToArray());

【讨论】:

  • 在我看来,您原始代码的唯一问题是您在result.BaseObject 上调用了.ToString(),这可以预见地为您提供您看到的输出;例如,从 PowerShell 窗口尝试 ([System.Collections.ArrayList] @()).ToString()
猜你喜欢
  • 2011-11-26
  • 2011-12-30
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2015-02-02
  • 2018-11-17
相关资源
最近更新 更多