具有ForEach-Object循环的GetEnumerator()

时间:2018-08-28 10:48:49

标签: powershell

我想在多个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)'"

我得到提示“ cmdlet ForEach-Object在命令管道位置1 ”到“ *为以下参数提供值:Process”。

我成功地使用了类似的方法来替换特定于语言的字符。

$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 :(得分:1)

正如Mathias R. Jessen所说,将左大括号放在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'"

答案 1 :(得分:0)

正如Mathias R. Jessen和John Seerden指出的那样,将花括号放在ForEach-Object的同一行上解决了该问题(因此,我不能让PowerShell Studio更改代码布局)。再次谢谢你。
具有讽刺意味的是,我作为工作示例指出的循环停止了工作。我必须做同样的修改才能使其再次运行。

当我这样调用它时,变量值是从函数返回的:

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