PowerShell实现AD用户新旧信息双列并排显示的问题
问题
需要为处理Active Directory(AD)用户变更的管理员展示直观的字段变更对比,现有PowerShell脚本输出的新旧字段为上下排列格式,希望改成左右并排的对比形式,方便管理员快速查看差异。
现有代码
$output = [pscustomobject]@{'UserName' = $user.samAccountName; 'FirstName' = $user.GivenName;'LastName' = $user.Surname;'DisplayName' = $user.DisplayName;'UPN' = $user.UserPrincipalName;'E-Mail_Address' = $user.proxyAddresses;'Title' = $user.Title;'Office' = $user.PhysicalDeliveryOfficeName;'Dept' = $user.Department;} $output[$index++] | Add-Member -NotePropertyMembers @{'NewUserName' = $samAccountName; 'NewFirstName' = $firstName;'NewLastName' = $lastname;'NewDisplayName' = $displayName;'NewUPN' = $UPN;'NewE-Mail_Address' = $SMTP1;'NewTitle' = $Title;'Newoffice' = $office;'NewDept' = $department;} $output
当前输出
UserName : FirstLast FirstName : First LastName : Last DisplayName : First Last UPN : FirstLast@company.com E-Mail_Address : SMTP:FirstLast@company.com Title : CEO Office : HQ Dept : Executives NewDept : Maintenance NewE-Mail_Address : SMTP:FirstLast@company.com NewOffice : The Dump NewFirstName : First NewLastName : Last NewUserName : FirstLast NewDisplayName : First Last NewUPN : FirstLast@company.com NewTitle : Trash Collector
期望输出
UserName : FirstLast NewUserName : FirstLast FirstName : First NewFirstName : First LastName : Last NewLastName : Last DisplayName : First Last NewDisplayName : First Last UPN : FirstLast@company.com NewUPN : FirstLast@company.com E-Mail_Address : SMTP:FirstLast@company.com NewE-Mail_Address : SMTP:FirstLast@company.com Title : CEO NewTitle : Trash Collector Office : HQ Newoffice : The Dump Dept : Executives NewDept : Maintenance
解决方案
要实现左右并排的对比格式,需要手动配对新旧字段并格式化输出行。修改后的代码示例如下:
# 分别存储原始用户数据和新数据 $originalData = @{ 'UserName' = $user.samAccountName 'FirstName' = $user.GivenName 'LastName' = $user.Surname 'DisplayName' = $user.DisplayName 'UPN' = $user.UserPrincipalName 'E-Mail_Address' = $user.proxyAddresses 'Title' = $user.Title 'Office' = $user.PhysicalDeliveryOfficeName 'Dept' = $user.Department } $newData = @{ 'NewUserName' = $samAccountName 'NewFirstName' = $firstName 'NewLastName' = $lastname 'NewDisplayName' = $displayName 'NewUPN' = $UPN 'NewE-Mail_Address' = $SMTP1 'NewTitle' = $Title 'NewOffice' = $office 'NewDept' = $department } # 定义新旧字段的配对顺序,确保对应关系一致 $fieldPairs = @( ('UserName', 'NewUserName'), ('FirstName', 'NewFirstName'), ('LastName', 'NewLastName'), ('DisplayName', 'NewDisplayName'), ('UPN', 'NewUPN'), ('E-Mail_Address', 'NewE-Mail_Address'), ('Title', 'NewTitle'), ('Office', 'NewOffice'), ('Dept', 'NewDept') ) # 遍历配对字段,格式化输出每行内容 foreach ($pair in $fieldPairs) { $originalField = $pair[0] $newField = $pair[1] # 格式化左侧内容,字段名固定宽度对齐 $leftPart = "{0,-20} : {1}" -f $originalField, $originalData[$originalField] # 格式化右侧内容,字段名固定宽度对齐 $rightPart = "{0,-25} : {1}" -f $newField, $newData[$newField] # 拼接左右部分并输出 Write-Host "$leftPart`t$rightPart" }
代码说明
- 将原始数据和新数据分别存入哈希表,便于按字段名快速取值
$fieldPairs数组定义了新旧字段的一一对应关系,保证输出顺序统一- 使用
-f格式化操作符,通过-20、-25设置字段名的固定宽度,确保左右列对齐整齐 - 用
Write-Host拼接左右部分输出,实现期望的并排对比格式
内容的提问来源于stack exchange,提问作者McKenning
相关产品推荐
相关产品推荐

