Compare-Object,其中来自平面文件的ReferenceObject不存在于DifferenceObject中



我希望在导入MIM之前检查工作日的平面csv文件。该文件每90分钟被转储到服务器的某个路径上。在将文件导入MIM之前,我想将最近的下载与上次导入进行比较。如果在ReferenceObject上出现的DifferenceObject上缺少一行,我想创建一个自定义对象并将每个对象添加到数组中。目前,我发现我正在捕捉所做的任何更改(duh我正在做一个不同的),但我想抓住的只是当一行完全丢失时。当一行完全丢失时,我正在使用InputObject并在逗号分隔符的每个位置使用.split方法。这里的关键是我想要观察帐户名称和状态。如果一个用户在ReferenceObject上是Active的,而在DifferenceObject上不存在,那么我将创建一个处于Terminated状态的用户的合成记录,以便在MIM导入文件之前附加到DifferenceObject上。在下一轮中,对象将再次丢失,但由于它处于终止状态,因此不会添加合成记录。如果用户被过滤出Workday文件,这将保护Active对象的删除,并且在Active状态下删除的取消雇佣现在将在对象删除之前作为终止流过系统,以适应Service now状态。

$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中是活跃的。我想基本上我只希望添加到$datarr时,在referenceObject中它们是活动的,在DifferenceObject中有行是$null,但没有$null行,当一个对象从Workday报告中过滤出来时,行计数长度更少。

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

    • 为此,最好(尽管较慢)使用使用Import-Csv将csv解析为对象而不是尝试通过Get-Content纯文本处理
  • 然后您可以通过它们的SamAccountName属性值关联对象Compare-Object允许您通过将属性名称传递给它的-Property参数来实现.

    • 添加-PassThruswitch确保完整的输入对象(总是来自-ReferenceObject集合)正在通过(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帐户名称的列,即使其名称不同-相应地调整。

  • (至少)-ReferenceObjectCSV有AccountStatus1AccountStatus2列;如果需要重命名这些属性,可以使用计算属性。

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

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

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

相关内容

  • 没有找到相关文章

最新更新