PowerShell脚本导出域内计算机本地用户数据至CSV格式异常求助
解决PowerShell导出CSV列混乱的问题
我明白你遇到的困扰——用Add-Content导出的CSV所有内容挤在同一列,这是因为Add-Content只是把文本直接写入文件,不会自动处理CSV的格式规则(比如字段分隔、引号包裹特殊字符)。正确的做法是创建自定义对象存储数据,再用Export-Csv命令导出,它会自动帮你生成规范的CSV结构。
下面是修改后的完整脚本,我会一步步解释关键改进点:
Import-Module ActiveDirectory $ErrorActionPreference = "SilentlyContinue" # 获取所有启用的域计算机 $Computers = Get-ADComputer -Filter { Enabled -eq $True } $OutputPath = "$Env:Temp" $OutputFile = Join-Path $OutputPath "LocalAdminsReport.csv" # 初始化空数组,用来存储所有结果对象 $reportData = @() foreach ($Computer in $Computers) { $ComputerName = $Computer.DNSHostName $Connectivity = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet if ($Connectivity) { Write-Host "Getting local users from $ComputerName" # 用Get-CimInstance替代Get-WmiObject(更现代、高效) $LocalUsers = Invoke-Command -ComputerName $ComputerName { Get-CimInstance -Class Win32_UserAccount -Filter "LocalAccount='True'" } foreach ($LocalUser in $LocalUsers) { # 为每个本地用户创建自定义对象,匹配CSV列 $userEntry = [PSCustomObject]@{ ComputerName = $ComputerName ComputerStatus = "Online" LocalUserName = $LocalUser.Name LocalUserEnabled = $LocalUser.Enabled LocalUserDescription = $LocalUser.Description } # 将对象添加到结果数组 $reportData += $userEntry } } else { Write-Host "$ComputerName Status Offline" # 为离线电脑创建一条空数据的对象 $offlineEntry = [PSCustomObject]@{ ComputerName = $ComputerName ComputerStatus = "Offline" LocalUserName = $null LocalUserEnabled = $null LocalUserDescription = $null } $reportData += $offlineEntry } } # 一次性导出所有数据到CSV,-NoTypeInformation去掉多余的类型头 $reportData | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8 Write-Host " " Write-Host "========================================" Write-Host "Report Path: $OutputFile " Write-Host "========================================"
关键改进说明:
- 用自定义对象存储数据:每个条目(不管是在线用户还是离线电脑)都被封装成
[PSCustomObject],对象的属性名和你需要的CSV列名完全对应,Export-Csv会自动把这些属性映射成CSV的列。 - 避免逐行写入文件:先把所有数据存入数组,最后一次性导出,比逐行追加更高效,也避免了格式错误。
- 替换
Get-WmiObject为Get-CimInstance:CIM是WMI的现代替代方案,兼容性更好,性能也更优,推荐使用。 - 规范CSV格式:
Export-Csv会自动处理字段分隔符、引号包裹(比如包含逗号的描述),生成符合规范的CSV文件,不会出现内容挤在一列的问题。
额外注意事项:
- 确保运行脚本的账号有域管理员权限,以及访问远程电脑的WMI/CIM权限。
- 如果需要覆盖已有文件,
Export-Csv默认会提示确认,你可以加-Force参数强制覆盖。 - 用
-Encoding UTF8确保导出的CSV支持中文等特殊字符。
内容的提问来源于stack exchange,提问作者Zack-SysAdmin
相关产品推荐
相关产品推荐

