Powershell:自动生成 AD 数组导出 "pointer"
Powershell: AD array export auto-generate "pointer"
我想从 Microsoft Active Directory 中导出多个多值 "fields"。我不想手动定义所有 "array pointers",而是想自动生成它们。
我已经查过了
Powershell outputting array items when interpolating within double quotes 并尝试了几种替代方法,但我总是被表达式卡住
$SearchBases ='dummy.com','dummy2.com'
$csv_file_path = "C:\Test\Export.csv"
$properties_select = ''
$properties_multivalue = 'proxyAddresses','showInAddressBook','memberOf'
# go through each multi_value property and automatically generate 8 fields for upto 8 array elements
ForEach($prop in $properties_multivalue) {
for ($i=0; $i -le 8; $i++) {
$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}}
}
}
ForEach($SearchBase in $SearchBases) {
Get-ADObject -filter 'objectClass -eq "contact"' -SearchBase $SearchBase -properties $properties_multivalue
|SELECT-Object $properties_select
|Export-Csv -Append -Force -Delimiter ";" -NoClobber -Encoding UTF8 -path $csv_file_path
}
我怀疑我在
做错了什么
$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}}
任何 help/hints 都是有用的。
谢谢
克里斯
您需要解决两件事:
$properties_multivalue
的结果值将是一个字符串而不是哈希表数组,因此将第 3 行更改为:
$properties_select = @()
第二件事是 Expression
脚本块 - 当 Select-Object
在第二个循环中执行时,$prop
和 $i
将解析为 memberOf
和 8
分别是在第一个循环中分配给它们的最后两个值。
要使各个脚本块 "remember" 具有分配时的值,您需要使用 GetNewClosure()
方法关闭它们:
$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}.GetNewClosure()}
此外,我认为您需要将 Expression
中变量的求值重新排序为:$($_.$prop)[$i]
(即首先引用 $_.memberOf
,然后在该值的索引 $i
)
我想从 Microsoft Active Directory 中导出多个多值 "fields"。我不想手动定义所有 "array pointers",而是想自动生成它们。
我已经查过了 Powershell outputting array items when interpolating within double quotes 并尝试了几种替代方法,但我总是被表达式卡住
$SearchBases ='dummy.com','dummy2.com'
$csv_file_path = "C:\Test\Export.csv"
$properties_select = ''
$properties_multivalue = 'proxyAddresses','showInAddressBook','memberOf'
# go through each multi_value property and automatically generate 8 fields for upto 8 array elements
ForEach($prop in $properties_multivalue) {
for ($i=0; $i -le 8; $i++) {
$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}}
}
}
ForEach($SearchBase in $SearchBases) {
Get-ADObject -filter 'objectClass -eq "contact"' -SearchBase $SearchBase -properties $properties_multivalue
|SELECT-Object $properties_select
|Export-Csv -Append -Force -Delimiter ";" -NoClobber -Encoding UTF8 -path $csv_file_path
}
我怀疑我在
做错了什么$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}}
任何 help/hints 都是有用的。
谢谢 克里斯
您需要解决两件事:
$properties_multivalue
的结果值将是一个字符串而不是哈希表数组,因此将第 3 行更改为:
$properties_select = @()
第二件事是 Expression
脚本块 - 当 Select-Object
在第二个循环中执行时,$prop
和 $i
将解析为 memberOf
和 8
分别是在第一个循环中分配给它们的最后两个值。
要使各个脚本块 "remember" 具有分配时的值,您需要使用 GetNewClosure()
方法关闭它们:
$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}.GetNewClosure()}
此外,我认为您需要将 Expression
中变量的求值重新排序为:$($_.$prop)[$i]
(即首先引用 $_.memberOf
,然后在该值的索引 $i
)