PowerShell函数处理多用户时哈希表仅加载一次问题求助
问题根因&修复方案
核心问题点
- 哈希表初始化位置错误:你将
$Properties = @{}写在了Begin块中,整个函数运行期间只会初始化一次。第一个用户遍历完成后,Company、Department键已经存在于哈希表中,遍历第二个用户时再次调用Add方法添加同名键会直接触发异常,被catch块捕获后执行continue跳过后续逻辑,因此只输出了一次结果。 - 报错信息变量拼写错误:
catch块中你写的是$_.Exception.Messge,正确拼写为$_.Exception.Message,这导致你看不到重复键的报错提示,无法定位问题。 - 潜在重复添加风险:如果有多个用户匹配
DisplayName的特殊规则,重复添加FirstNamePreferred键也会触发相同的重复键异常。
修复方法
将哈希表初始化逻辑移动到foreach循环内部,每个用户处理时都生成全新的空哈希表即可,修正后代码如下:
Function Change-DRAUserProperty { Param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string[]]$UserName, $Company, $Department, $DisplayName, $Name, $O, $PhysicalDeliveryOfficeName, $TelephoneNumber, $Title ) Begin { $OrgBoxOu = "*OU=XX, DC=XX" $Parameters = $PSBoundParameters # 移除原来的$Properties初始化,移到循环内 } Process { foreach ($User in $UserName) { try { $SelectedUser = $User $Properties = @{} # 每个用户单独初始化新哈希表 if ($SelectedUser) { $Parameters.GetEnumerator() | Where-Object Key -ne 'UserName' | ForEach-Object -Process ` { if ($_.Key -eq 'DisplayName' -and $SelectedUser.DistinguishedName -notlike $OrgBoxOu) { $Properties.Add('FirstNamePreferred', $_.Value) } $Properties.Add($_.Key, $_.Value) } $Properties #Set-DRAUser -Identifier $SelectedUser.DistinguishedName -Properties $Properties @DRA_Server_Splat -ErrorAction Stop } else { Write-Host -Object "No valid member selected!" } } catch { # 修正报错变量拼写 Write-Host -Object "$($_.Exception.Message)" -ForegroundColor Red -BackgroundColor Black continue } } } End { } }
验证效果
再次执行Change-DRAUserProperty -UserName Abe, Abe2, Abe3 -Company SSC -Department USSF即可输出3组对应哈希表,符合预期。
内容的提问来源于stack exchange,提问作者Abraham Zinala
相关产品推荐
相关产品推荐

