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 将解析为 memberOf8 分别是在第一个循环中分配给它们的最后两个值。

要使各个脚本块 "remember" 具有分配时的值,您需要使用 GetNewClosure() 方法关闭它们:

$properties_select += @{Name=$prop+'_'+$i; Expression={$_.$($prop[$i])}.GetNewClosure()}

此外,我认为您需要将 Expression 中变量的求值重新排序为:$($_.$prop)[$i](即首先引用 $_.memberOf,然后在该值的索引 $i)