函数只显示一次属性
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 人来哄我哈哈。总是很乐意为您提供帮助。以上是关于函数只显示一次属性的主要内容,如果未能解决你的问题,请参考以下文章
我试图用列表中的对象填充列表视图,但只显示名称属性,同时允许用户在列表视图中多选项目