You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
}

代码说明

  1. 将原始数据和新数据分别存入哈希表,便于按字段名快速取值
  2. $fieldPairs数组定义了新旧字段的一一对应关系,保证输出顺序统一
  3. 使用-f格式化操作符,通过-20、-25设置字段名的固定宽度,确保左右列对齐整齐
  4. 用Write-Host拼接左右部分输出,实现期望的并排对比格式

内容的提问来源于stack exchange,提问作者McKenning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:20:21