在匯入 MIM 之前,我希望從 Workday 中檢查一個平面 csv 檔案。該檔案每 90 分鐘轉儲到服務器上的一個路徑中。在將檔案匯入 MIM 之前,我想將最近一次下載與上次匯入進行比較。如果出現在 ReferenceObject 上的 DifferenceObject 上缺少一行,我想創建一個自定義物件并將每個物件添加到陣列中。目前我發現我正在捕獲所做的任何更改(呃,我正在做一個差異),但我想要抓住的是當一條線完全丟失時。當一行完全丟失時,我將使用 InputObject 并在逗號分隔符的每個位置使用 .split 方法。這里的關鍵是我要觀察賬戶名和狀態。如果用戶在 ReferenceObject 上處于活動狀態并且在 DifferenceObject 上不存在,則我將創建處于 Terminated 狀態的用戶的綜合記錄,以在 MIM 匯入檔案之前附加到 DifferenceObject 上。在下一輪中,該物件將再次丟失,但由于它處于終止狀態,因此不會添加合成記錄。如果用戶被從 Workday 檔案中過濾掉,這將保護 Active 物件的洗掉,以及在 Active 狀態下被洗掉的已撤銷員工現在將通過系統在物件洗掉之前終止,以適應 Service Now 狀態。在下一輪中,該物件將再次丟失,但由于它處于終止狀態,因此不會添加合成記錄。如果用戶被從 Workday 檔案中過濾掉,這將保護 Active 物件的洗掉,以及在 Active 狀態下被洗掉的已撤銷員工現在將通過系統在物件洗掉之前終止,以適應 Service Now 狀態。在下一輪中,該物件將再次丟失,但由于它處于終止狀態,因此不會添加合成記錄。如果用戶被從 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 中處于活動狀態時。我想基本上我只想在 referenceObject 中添加到 $datarr 時它們是 Active 并且在 DifferenceObject 中有行是 $null 但沒有 $null 行并且當從 Workday 報告中過濾出物件時行數長度會更少.
uj5u.com熱心網友回復:
您需要通過識別列值來關聯這兩個 CSV 檔案,我認為它們在
SamAccountName列中。- 為此,最好(盡管速度較慢)用于將
Import-CsvCSV 決議為物件,而不是嘗試通過以下方式進行純文本處理Get-Content
- 為此,最好(盡管速度較慢)用于將
然后,您可以通過它們的屬性值關聯物件
SamAccountName,這Compare-Object允許您通過將屬性名稱傳遞給它的-Property引數來完成。- 添加
-PassThru開關可確保傳遞完整的輸入物件(始終來自集合)(用屬性裝飾)-ReferenceObjectSideIndicator
- 添加
因此,我認為您正在尋找類似以下的內容:
$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 有AccountStatus1和AccountStatus2列;如果需要重命名這些屬性,可以使用計算屬性。
如果您的 CSV 檔案缺少 headers,請將所需的列名作為陣列提供給Import-Csv's -Header引數;例如:
$colNames = 'SamAccountName', 'foo', 'bar', 'AccountStatus1', 'AccountStatus2'
Import-Csv -Header $colNames results.20220421_1532.csv
請注意,如果剩余的列不感興趣,則您傳遞的名稱可能少于 CSV 中的列數,但必須為每一列指定名稱,直到最后一個感興趣的列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/462209.html
