比较对象,其中来自平面文件的 ReferenceObject 仅在 DifferenceObject 中不存在

Compare-Object where ReferenceObject from flat file doesnt exist in DifferenceObject only

我希望在导入 MIM 之前检查来自 Workday 的平面 csv 文件的完整性。该文件每 90 分钟转储到服务器上的一个路径中。在将文件导入 MIM 之前,我想将最近的下载与上次导入进行比较。如果出现在 ReferenceObject 上的 DifferenceObject 上缺少一行,我想创建一个自定义对象并将每个对象添加到一个数组中。目前我发现我正在捕获所做的任何更改(呃我正在做差异)但是我想要抓住的只是当一条线完全丢失时。当一行完全丢失时,我将使用 InputObject 并在逗号分隔符的每个位置使用 .split 方法。这里的关键是我要观察账户名和状态。如果用户在 ReferenceObject 上处于活动状态但在 DifferenceObject 上不存在,我将创建一个处于 Terminated 状态的用户的综合记录,以在 MIM 导入文件之前附加到 DifferenceObject。在下一轮中,该对象将再次丢失,但由于它处于终止状态,因此不会添加合成记录。如果将用户从 Workday 文件中过滤掉,这将保护删除活动对象,并且在活动状态下被删除的已撤销雇员现在将在对象删除之前终止通过系统流动,以适应立即服务状态。

$diff = Compare-Object -ReferenceObject (Get-Content -Path results.20220421_1532.csv) -DifferenceObject (Get-Content -Path results.20220421_1705.csv)
$datarr = @()
$diff | Where-Object { $_.sideIndicator -eq "<=" } |  ForEach-Object {
    $obj = [PSCustomObject]@{
        SamAccountName = $_.InputObject.Split(",")[0]
        AccountStatus1 = $_.InputObject.Split(",")[8]
        AccountStatus2  = $_.InputObject.Split(",")[9]
    }
    if ($obj.AccountStatus2 -like "Active") {
        $datarr += $obj    
    }else {}
}

目前您可以看到我正在将用户添加到 $datarr 中,当发生更改并且他们在 referenceObject 中处于活动状态时。我想基本上我只是想在 referenceObject 中添加到 $datarr 它们是活动的并且在 DifferenceObject 中有行是 $null 但是没有 $null 行并且当对象被从 Workday 报告中过滤掉时行数长度更少.

  • 您需要通过它们的标识列值 将两个 CSV 文件相关联,我认为它在 SamAccountName 列中。

    • 为此,使用 Import-Csv to parse the CSVs into objects instead of trying plain-text processing via Get-Content
    • 更好(尽管速度较慢)
  • 然后您可以 通过它们的 SamAccountName 属性 值 关联 objects, Compare-Object 允许您将 属性 名称传递给它的 -Property 参数 .

    • 添加 -PassThru 开关可确保 完整输入 objects(始终来自 -ReferenceObject collection) 正在通过(装饰 SideIndicator 属性)

因此,我认为您正在寻找如下内容:

$datarr = 
  Compare-Object -Property SamAccountName -PassThru `
    -ReferenceObject  (Import-Csv results.20220421_1532.csv) `
    -DifferenceObject (Import-Csv results.20220421_1705.csv) | 
      Where-Object SideIndicator -EQ '<=' | 
        Where-Object AccountStatus2 -eq Active |
          Select-Object SamAccountName, AccountStatus1, AccountStatus2

请注意,我假设:

  • 两个 CSV 都有一个 SamAccountName 列或至少共享包含 SAM 帐户名称的 a 列,即使其名称不同 - 相应地进行调整。

  • (至少)-ReferenceObject CSV 有 AccountStatus1AccountStatus2 列;如果您需要 重命名 这些属性,您可以使用 calculated properties.

如果您的 CSV 文件 缺少 headers,请将所需的列名作为数组提供给 Import-Csv
-Header参数;例如:

$colNames = 'SamAccountName', 'foo', 'bar', 'AccountStatus1', 'AccountStatus2'
Import-Csv -Header $colNames results.20220421_1532.csv

请注意,如果对其余列不感兴趣,则您传递的名称可能少于 CSV 中的列数,但必须为直到感兴趣的最后一列的每一列指定名称。