GetEnumerator () с циклом ForEach-Object - PullRequest
0 голосов
/ 28 августа 2018

Я хочу найти пользователя в нескольких локализациях AD. Я хотел бы избежать использования нескольких операторов if с использованием хеш-таблицы, но я не могу сделать это правильно. Моя попытка:

$ADSzukajTu = [ordered]@{
'1' = 'OU=sales,DC=contoso,DC=pl'
'2' = 'OU=hr,DC=contoso,DC=pl'
'3' = 'OU=marketing,DC=contoso,DC=pl'
'4' = 'OU=production,DC=contoso,DC=pl'
}

function SzukajADUsera ($fSzukajADUseraKogo)
{
    $i = 0
    do
    {
        $ADSzukajTu.GetEnumerator() | ForEach-Object
        {
            $ADUser = Get-ADUser -Filter $fSzukajADUseraKogo -Server $ADDC -SearchBase $_.Value -Properties name, sAMAccountName, sn, givenName, l, title, displayName, company, department, StreetAddress, Office, OfficePhone, Manager, mail, PostalCode, State, Country -ErrorAction SilentlyContinue | Select-Object -Property name, sAMAccountName, sn, givenName, l, title, displayName, company, department, StreetAddress, Office, OfficePhone, Manager, mail, PostalCode, State, Country
            $i++
        }
    }
    While ((($ADUser | Measure-Object).Count -lt 1) -and ($i -le $ADSzukajTu.Count))
    Return $ADUser
}

Когда я запускаю скрипт и вызываю функцию

SzukajADUsera -fSzukajADUseraKogo "sAMAccountName -eq '$($WzorUser.sAMAccountName)'"

Я получаю приглашение « командлет ForEach-Object в позиции командного конвейера 1 » для «* Предоставить значения для следующих параметров: Процесс».

Я успешно использую аналогичный подход при замене языковых символов.

$PodmianyPLZnaki = [ordered]@{
    'ą' = 'a'
    'ć' = 'c'
    'ę' = 'e'
    'ł' = 'l'
    'ń' = 'n'
    'ó' = 'o'
    'ś' = 's'
    'ź' = 'z'
    'ż' = 'z'
}

$NoweMail = ($WzorUser.GivenName + '.' + $WzorUser.Surname).ToLower()
$PodmianyPLZnaki.GetEnumerator() | ForEach-Object
{
    $NoweMail = $NoweMail -replace $_.Key, $_.Value
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Как указали Матиас Р. Джессен и Джон Сирден, использование фигурной скобки на той же строке, что и ForEach-Object, решило проблему (поэтому я не могу позволить PowerShell Studio изменить компоновку кода). Спасибо тебе снова.
По иронии судьбы петля, которую я указал в качестве рабочего примера, перестала работать. Я должен сделать то же самое исправление, чтобы снова запустить его.

И значение переменной было возвращено из функции, когда я вызываю ее так:

$ADUser = SzukajADUsera -fSzukajADUseraKogo "sAMAccountName -eq '$($WzorUser.sAMAccountName)'"
0 голосов
/ 28 августа 2018

Как сказал Матиас Р. Джессен, поместите открывающую фигурную скобку в ту же строку, что и ForEach-Object. Это требуется не только после ForEach-Object, но также и с лучшей практикой и поможет вам лучше устранять эти ситуации в будущем.

Я также считаю, что есть лучшие, более эффективные способы достижения желаемого результата. Пожалуйста, обратитесь к следующему примеру, я попытался сохранить язык, используемый в переменных.

function SzukajADUsera () {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        $fSzukajADUseraKogo
    )

    $ADSzukajTuArray = @(
        'OU=sales,DC=contoso,DC=pl'
        'OU=hr,DC=contoso,DC=pl'
        'OU=marketing,DC=contoso,DC=pl'
        'OU=production,DC=contoso,DC=pl'
    )

    $ADUser = Get-ADUser -Filter $fSzukajADUseraKogo
    foreach($ADSzukajTu in $ADSzukajTuArray) {
        if($ADUser.DistinguishedName -match $ADSzukaj) {
            return $ADUser
        }
    }
}

SzukajADUsera -fSzukajADUseraKogo "sAMAccountName -eq 'test.user'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...