Powershell: экспорт массива AD автоматически генерирует «указатель» - PullRequest
0 голосов
/ 10 июня 2018

Я хотел бы экспортировать несколько многозначных «полей» из Microsoft Active Directory.Вместо того, чтобы определять все «указатели массива» вручную, я хочу сгенерировать их автоматически.

Я уже проверил Вывод элементов массива Powershell при интерполяции в двойных кавычках и опробовал несколько альтернатив, но я всегда застреваюс выражениями

$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])}}

Любая помощь / подсказки полезны.

Спасибо Крис

1 Ответ

0 голосов
/ 10 июня 2018

Две вещи, которые нужно исправить:

Полученное значение $properties_multivalue будет строкой, а не массивом хеш-таблиц, поэтому измените строку 3 на:

$properties_select = @()

.Во-вторых, это Expression скрипт-блок - к тому времени, когда Select-Object выполнится во втором цикле, $prop и $i будут преобразованы в memberOf и 8 соответственно, последние два значения, которые были назначены им впервый цикл.

Чтобы отдельные скриптовые блоки "запоминали" значения, какими они были на момент назначения, вам необходимо закрыть их с помощью метода GetNewClosure():

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

Кроме того, я думаю, вам нужно изменить порядок вычисления переменных внутри Expression в: $($_.$prop)[$i] (т. Е. Сначала ссылаться на $_.memberOf, а затем получить значение по индексу $i этого значения)

...