如何处理具有某些对偶值的哈希 Table?使用字符串
How to Handle Hash Table with Some Dual Values? Working with Strings
我的任务是在 AD 中查找用户部门,然后将它们与查找 CSV 交叉引用文件中的部门手册进行匹配。他们每个部门都有 1 个代码,映射到 1 个手册,但在某些情况下,一个部门可能会得到 2 个不同的手册。
文件 1:
Code Manual
A Administrative
B Ambulatory Care
C Anatomic Pathology & Clinical Laboraties
文件 2:
AD Departments Code
300P RENEWAL A3
ACCOUNTING OPERATIONS A11
ACCOUNTS PAYABLE A11
ACCREDITATION A
ADVANCED LUNG DISEASE B
AGING ADULT SERVICES A3
ANESTHESIA A6
APP - INPATIENT A3
B2 A3
BENEFITS MANAGEMENT A11
BLOOD TRANSFUSION SERVICES A3
BMT SERVICE LINES B
Business Development V
BUSINESS OPS&STRATEGIC INIT V
BW DIGESTIVE HEALTH CENTER B, V
如果一个部门与文件一对一映射,此代码工作正常,但在 AD 部门有 2 个代码(用于 2 个不同的手册)的情况下,它似乎只获取第一个。有没有一种简单的方法可以像上次 BW 消化健康中心那样列出两者,他们需要手册 B 和 V?理想情况下,$DeptMan
可以在需要的地方列出 2 个值。
这是我目前的情况:
$Depts | ForEach-Object {
$Table1[$_.'AD Departments'] = $_
}
$Manuals | ForEach-Object {
$Table2[$_.Code] = $_
}
$Managers = Get-ADUser -Filter {some filter} -pr SamaccountName,GivenName,Initials, SN,Company,Title,Department
foreach ($Man in $Managers) {
$Dept = $Man.Department
$Code = $Table1.Item("$Dept")
$CodeMap = $Code.code
$Manual = $Table2.Item("$CodeMap")
$DeptMan = $Manual.Manual
$Man |
select @{Name="SID";Expression={$Man.SamAccountName}},
@{Name="FirstName";Expression={$Man.givenName}},
@{Name="Initials";Expression={$Man.Initials}},
@{Name="LastName";Expression={$Man.sn}},
@{Name="Department";Expression={$Man.Department}},
@{Name="Email";Expression={$Man.Mail}},
@{Name="Manual";Expression={$DeptMan}} |
Export-Csv C:\output.csv -NoType -Append
}
好吧,我终于明白了。您必须重置 foreach 循环中的变量,并将 $codes 更改为字符串,否则它们不会计算为 True 或 False。一旦我进入 If 块,我就重新创建了新的手动变量,它似乎可以工作。我在初始脚本开头发布的所有其他内容都没有改变。希望这可以帮助某人。
foreach ($Man in $Managers) {
$DeptMan = $Null
$DeptMan1 = $Null
$Dept = $Man.Department
$Code = $Table1.item("$Dept")
[string]$CodeMap = $code.code
$Manual = $Table2.item("$CodeMap")
$DeptMan = $Manual.Manual
if ($CodeMap -like "*,*") {$CodeMap1 = $code.code.Split(", ",[System.StringSplitOptions]::RemoveEmptyEntries)
[string]$CodeMap2 = $CodeMap1[0]
[string]$CodeMap3 = $CodeMap1[1]
$Manual1 = $Table2.item("$CodeMap2")
$Manual2 = $Table2.item("$CodeMap3")
$DeptMan = $Manual1.Manual
$DeptMan1 = $Manual2.Manual
}
$Man | select @{Name="SID";Expression={$Man.SamAccountName}},
@{Name="FirstName";Expression={$Man.givenName}},
@{Name="Initials";Expression={$Man.Initials}},
@{Name="LastName";Expression={$Man.sn}},
@{Name="Department";Expression={$Man.Department}},
@{Name="Email";Expression={$Man.Mail}},
@{Name="Manual1";Expression={$DeptMan}},
@{Name="Manual2";Expression={$DeptMan1}}| export-csv C:\Scripts-Manuals_$((Get-Date).ToString('MM-dd-yyyy')).csv -NoTypeInformation -append
}
我的任务是在 AD 中查找用户部门,然后将它们与查找 CSV 交叉引用文件中的部门手册进行匹配。他们每个部门都有 1 个代码,映射到 1 个手册,但在某些情况下,一个部门可能会得到 2 个不同的手册。
文件 1:
Code Manual A Administrative B Ambulatory Care C Anatomic Pathology & Clinical Laboraties
文件 2:
AD Departments Code 300P RENEWAL A3 ACCOUNTING OPERATIONS A11 ACCOUNTS PAYABLE A11 ACCREDITATION A ADVANCED LUNG DISEASE B AGING ADULT SERVICES A3 ANESTHESIA A6 APP - INPATIENT A3 B2 A3 BENEFITS MANAGEMENT A11 BLOOD TRANSFUSION SERVICES A3 BMT SERVICE LINES B Business Development V BUSINESS OPS&STRATEGIC INIT V BW DIGESTIVE HEALTH CENTER B, V
如果一个部门与文件一对一映射,此代码工作正常,但在 AD 部门有 2 个代码(用于 2 个不同的手册)的情况下,它似乎只获取第一个。有没有一种简单的方法可以像上次 BW 消化健康中心那样列出两者,他们需要手册 B 和 V?理想情况下,$DeptMan
可以在需要的地方列出 2 个值。
这是我目前的情况:
$Depts | ForEach-Object {
$Table1[$_.'AD Departments'] = $_
}
$Manuals | ForEach-Object {
$Table2[$_.Code] = $_
}
$Managers = Get-ADUser -Filter {some filter} -pr SamaccountName,GivenName,Initials, SN,Company,Title,Department
foreach ($Man in $Managers) {
$Dept = $Man.Department
$Code = $Table1.Item("$Dept")
$CodeMap = $Code.code
$Manual = $Table2.Item("$CodeMap")
$DeptMan = $Manual.Manual
$Man |
select @{Name="SID";Expression={$Man.SamAccountName}},
@{Name="FirstName";Expression={$Man.givenName}},
@{Name="Initials";Expression={$Man.Initials}},
@{Name="LastName";Expression={$Man.sn}},
@{Name="Department";Expression={$Man.Department}},
@{Name="Email";Expression={$Man.Mail}},
@{Name="Manual";Expression={$DeptMan}} |
Export-Csv C:\output.csv -NoType -Append
}
好吧,我终于明白了。您必须重置 foreach 循环中的变量,并将 $codes 更改为字符串,否则它们不会计算为 True 或 False。一旦我进入 If 块,我就重新创建了新的手动变量,它似乎可以工作。我在初始脚本开头发布的所有其他内容都没有改变。希望这可以帮助某人。
foreach ($Man in $Managers) {
$DeptMan = $Null
$DeptMan1 = $Null
$Dept = $Man.Department
$Code = $Table1.item("$Dept")
[string]$CodeMap = $code.code
$Manual = $Table2.item("$CodeMap")
$DeptMan = $Manual.Manual
if ($CodeMap -like "*,*") {$CodeMap1 = $code.code.Split(", ",[System.StringSplitOptions]::RemoveEmptyEntries)
[string]$CodeMap2 = $CodeMap1[0]
[string]$CodeMap3 = $CodeMap1[1]
$Manual1 = $Table2.item("$CodeMap2")
$Manual2 = $Table2.item("$CodeMap3")
$DeptMan = $Manual1.Manual
$DeptMan1 = $Manual2.Manual
}
$Man | select @{Name="SID";Expression={$Man.SamAccountName}},
@{Name="FirstName";Expression={$Man.givenName}},
@{Name="Initials";Expression={$Man.Initials}},
@{Name="LastName";Expression={$Man.sn}},
@{Name="Department";Expression={$Man.Department}},
@{Name="Email";Expression={$Man.Mail}},
@{Name="Manual1";Expression={$DeptMan}},
@{Name="Manual2";Expression={$DeptMan1}}| export-csv C:\Scripts-Manuals_$((Get-Date).ToString('MM-dd-yyyy')).csv -NoTypeInformation -append
}