函数只显示一次属性

Posted

技术标签:

【中文标题】函数只显示一次属性【英文标题】:Function only diplays properties once 【发布时间】:2022-01-01 07:35:25 【问题描述】:

我有一个函数,由于某种原因,似乎只显示一次$Properties,无论有多少用户传递给脚本。试图仅将 $user 传递到脚本中以显示,但是,它也只显示一次。不太清楚它为什么会这样做,因为我已经用尽了关于它可能是什么的想法:

Function Set-DRAUserProperty 
    Param (
        
        [Parameter(Mandatory=$true,
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true)]
        [string[]]$UserName,

        $Company,
        $Department,
        $Name,
        $O, 
        $PhysicalDeliveryOfficeName,
        $TelephoneNumber,
        $Title
    )
    DynamicParam
    
        if ($UserName.Split(',').Count -le 1) 
            $displayNameAttribute = New-Object System.Management.Automation.ParameterAttribute
            $displayNameAttribute.Mandatory = $false
            $attributeCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
            $attributeCollection.Add($displayNameAttribute)
            $displayNameParam = New-Object System.Management.Automation.RuntimeDefinedParameter('DisplayName', [string], $attributeCollection)
            $paramDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
            $paramDictionary.Add('DisplayName', $displayNameParam)
            $paramDictionary
       
    
    Begin 
    
        $OrgBoxOu   = "*OU=xxxxxxxxx"
        $Parameters = $PSBoundParameters
        $Properties = @
    
    Process 
    
        foreach ($User in $UserName) 
           
            try 
                $SelectedUser = Get-ADUser -Identity $User -Properties DisplayName
                    if ($SelectedUser) 
                        $Parameters.GetEnumerator() | Where-Object -FilterScript $_.Key -ne 'UserName' | 
                            ForEach-Object -Process `
                            
                                if ($_.Key -eq 'DisplayName' -and $SelectedUser.DistinguishedName -like $OrgBoxOu) 
                                    if ('FirstNamePreferred' -in $Properties.Keys) 
                                        Continue
                                    
                                    else 
                                        $Properties.Add($_.Key, $_.Value)
                                        $Properties.Add('FirstNamePreferred', $_.Value) 
                                    
                                
                                else 
                                    if ($_.Key -in $Properties.Keys)  
                                        Continue
                                    
                                    else 
                                        $Properties.Add($_.Key, $_.Value) 
                                    
                                
                            

                        $Properties.GetEnumerator()
                        #Set-DRAUser -Identifier $SelectedUser.DistinguishedName -Properties $Properties @DRA_Server_Splat -ErrorAction Stop
                    

                    else 
                        Write-Host -Object "No valid member selected!"
                    
            
            catch 
                Write-Host -Object "ERROR: $($_.Exception.Message)" -ForegroundColor Red -BackgroundColor Black
                continue
            

        

    
    End  

运行函数时,

Set-DRAUserProperty -UserName Abe,Abe -Company ssc

。 . .输出只显示一次:

Name                           Value                                                                                                                                                                                                                             
----                           -----                                                                                                                                                                                                                             
Company                        ssc  

我想要实现的是将值分散到另一个 cmdlet 上,但只要我的 $Properties 哈希表只显示一次,它就不会工作。所以预期的输出将是显示每个用户的哈希表,这些用户已传递给函数:

Name                           Value                                                                                                                                                                                                                             
----                           -----                                                                                                                                                                                                                             
Company                        ssc  

Name                           Value                                                                                                                                                                                                                             
----                           -----                                                                                                                                                                                                                             
Company                        ssc  

只是寻找一些可以为我指明正确方向和/或阐明可能发生的事情的新眼睛(错误)。 不确定是什么导致了问题,因此无法将其定位到特定的代码部分

请教育我:)

【问题讨论】:

预期的输出是什么? @SantiagoSquarzon,我的错!刚刚更新了帖子。应该只显示传递给函数的每个用户的哈希表。谢谢! 乍一看,$Properties = @ 应该在foreach 循环中定义。 如果您两次传入同一个用户,如果密钥已存在于 $properties 哈希表中,您的代码似乎设置为不返回任何输出?你有没有用两个不同的用户测试过这个?因为您的示例使用同一用户两次。 $Properties = @ 移动到foreach ($User in $UserName) 循环下方会给我预期的输出。 【参考方案1】:

解决方案是在foreach 循环内而不是在begin ... 块内定义hashtable

foreach ($User in $UserName) 

    $Properties = @
    ....
    ....

但如果你想了解为什么它以前不起作用?,这是你的提示:

if ($_.Key -in $Properties.Keys)  
    '0 is in $Properties.Keys :)' -f $_.Key
    Continue

产量:

Name                           Value
----                           -----
Company                        ssc
Company is in $Properties.Keys :)
Company is in $Properties.Keys :)

这只是因为$Properties 在每次迭代中都相同(因为它是在begin ... 块中定义的)。

【讨论】:

愿您随时随地都能找到适合您的袜子的那双!谢谢;) @AbrahamZinala 你总是用这些 cmets 人来哄我哈哈。总是很乐意为您提供帮助。

以上是关于函数只显示一次属性的主要内容,如果未能解决你的问题,请参考以下文章

警报视图显示多次而不是一次

vue计算属性computed和监视器watch的使用

我试图用列表中的对象填充列表视图,但只显示名称属性,同时允许用户在列表视图中多选项目

CircularProgressIndicator 只显示一次

.sheet:只显示一次,然后再也不显示

java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序