Set-ADUser脚本处理CSV空单元格触发Replace错误如何解决
故障原因
你当前的脚本会强制将CSV所有字段的值传递给Set-ADUser的对应参数,当某个字段为空时,相当于给AD属性更新接口传入了空值,底层Replace操作不支持这种调用方式,就会抛出你遇到的报错。
解决方法
推荐使用PowerShell参数哈希表(Splatting)动态生成更新参数,仅把非空的字段加入更新队列,修改后的代码如下:
# 定义CSV字段名和Set-ADUser参数的对应关系 $fieldMap = @{ Title = "Title" TelephoneNumber = "OfficePhone" Mobile = "MobilePhone" facismileTelephoneNumber = "Fax" streetAddress = "StreetAddress" city = "City" st = "State" postalCode = "PostalCode" } $TestUsers = Import-Csv -Path "C:\Users\test.admin\Documents\ADDummyTestUsers.csv" foreach ($user in $TestUsers) { # 初始化参数表,先指定必填的用户身份参数 $updateParams = @{ Identity = $user.sAMAccountName } # 遍历所有映射字段,仅非空值加入更新列表 foreach ($csvField in $fieldMap.Keys) { $fieldValue = $user.$csvField if (-not [string]::IsNullOrWhiteSpace($fieldValue)) { $updateParams[$fieldMap[$csvField]] = $fieldValue.Trim() } } # 执行用户属性更新 Set-ADUser @updateParams }
如果你需要CSV为空的字段对应清空AD里该用户的原有属性,可以调整逻辑增加-Clear参数处理,示例如下:
foreach ($user in $TestUsers) { $updateParams = @{ Identity = $user.sAMAccountName Clear = @() } foreach ($csvField in $fieldMap.Keys) { $fieldValue = $user.$csvField $adAttrName = $fieldMap[$csvField] if (-not [string]::IsNullOrWhiteSpace($fieldValue)) { $updateParams[$adAttrName] = $fieldValue.Trim() } else { $updateParams["Clear"] += $adAttrName.ToLower() } } # 无待清空属性时移除Clear参数避免报错 if ($updateParams["Clear"].Count -eq 0) { $updateParams.Remove("Clear") } Set-ADUser @updateParams }
内容的提问来源于stack exchange,提问作者iamgregt
相关产品推荐
相关产品推荐

