函数只显示一次属性
Function only diplays properties once
我有一个功能,出于某种原因,似乎只显示 $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
只是在寻找一些可以为我指明正确方向的新视角 and/or,阐明可能发生的事情(错误)。 不确定是什么导致了问题,因此无法将其精确指向特定的代码部分。
请多多指教:)
解决方案是在 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 { ... }
块中定义的)。
我有一个功能,出于某种原因,似乎只显示 $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
只是在寻找一些可以为我指明正确方向的新视角 and/or,阐明可能发生的事情(错误)。 不确定是什么导致了问题,因此无法将其精确指向特定的代码部分。
请多多指教:)
解决方案是在 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 { ... }
块中定义的)。