【问题标题】:Access returned values from PowerShell ForEach Object访问 PowerShell ForEach 对象的返回值
【发布时间】:2019-11-20 03:33:35
【问题描述】:

我对 PowerShell 有点陌生,我正在尝试做一些在 C#.NET 和 Java 等其他语言中非常简单的事情。

我在做什么:

  • 我正在尝试读取包含“clientid”、“parentid”和“schoolid”三个定义列的 CSV 文件。
  • 我只需要对数据的唯一行进行分组。
  • 我需要访问这些数据行以通过作为参数传递数据来解析和执行其他功能

    $obj = Import-Csv $Name | Group-Object clientid, parentid, schoolid | 
        foreach-object { 
            $_.group | 
                sort-object clientid, parentid, schoolid | 
                    select  clientid, parentid, schoolid -last 1
        }
    
    foreach ( $row in $obj ) { 
        $_clientid = $row[0];
        $_parentid = $row[1];
        $_schoolid = $row[2];   
        Other-Function -client $_.clientid -parent $_.parentid -schoolid $_.schoolid
    }
    

【问题讨论】:

  • 在您的foreach 循环中,$row 将是当前对象。您可以直接访问其属性,例如$row.clientid,然后可以将其用作函数中的参数值。
  • 索引语法[n] 用于访问集合中该位置的第n 个项目(从0 开始)。 $obj 是一个对象集合,每个对象都具有您选择的所有属性。所以$obj[0] 将返回这些对象中的第一个及其所有属性。 foreach 循环只允许您遍历该集合。所以$row[1] 几乎总是什么都不返回,除非 $obj 包含集合的集合。

标签: powershell foreach


【解决方案1】:

由于您只读取 3 列 CSV 或仅使用这 3 列,您可能希望简化一些:

Import-Csv $Name | 
  Select-Object clientid, parentid, schoolid -unique | 
    Foreach-Object { 
      Other-Function -client $_.clientid -parent $_.parentid -schoolid $_.schoolid
    }

那么我们在做什么呢?

  • 导入 CSV
  • 唯一选择3列
  • ...然后为每一行调用您的其他函数。

(我喜欢 Group-Object 并认为它没有被充分利用,但在这里没有必要并且过于复杂;带有 -Unique 的 Select-Object 更简单。)

我们可能还想知道为什么您的“Other-Function”采用 3 个单独的参数而不是一个对象,但这在某种程度上是一种样式选择。

让 PowerShell 为您完成(大部分)工作。

【讨论】:

  • 感谢您的直截了当的回答,因为它成功了。我的另一个函数需要几个参数而不是一个对象,因为我不确定如何在 PowerShell 中执行此操作,因为我仍在研究这个,但我会研究它以加强脚本。谢谢!
  • 最简单的方法是将“Other-Function”的参数块更改为(也)将 Object 当作这样的对象:[Object]$StudentInfo # 或任何您想调用的名称。您可以保留单独的参数(只要您继续使用命名参数调用其中一组,或者如果您将始终使用“完整对象”,则可以删除它们。)如果您离开,那么您需要制作单独对象和单个对象之间的代码区别。另请注意,您可以通过多种方式将一堆元素/值转换为对象:也许最简单的是 [PSCustomObject]@{a=1; b=2; c=3}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 2013-06-09
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
相关资源
最近更新 更多