我希望在导入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
参数来实现.- 添加
-PassThru
switch确保完整的输入对象(总是来自-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帐户名称的列,即使其名称不同-相应地调整。(至少)
-ReferenceObject
CSV有AccountStatus1
和AccountStatus2
列;如果需要重命名这些属性,可以使用计算属性。
如果您的CSV文件缺少标题,将所需的列名作为数组提供给Import-Csv
的-Header
参数;例如:
$colNames = 'SamAccountName', 'foo', 'bar', 'AccountStatus1', 'AccountStatus2'
Import-Csv -Header $colNames results.20220421_1532.csv
请注意,如果其余的列不感兴趣,则可以传递的名称少于CSV中的列数,但是必须为每个列指定名称,直到最后一个感兴趣的列。