PowerShell 5.1脚本:远程AD主机信息单行输出及CSV转换求助
PowerShell脚本修改方案(解决信息分行+CSV输入输出)
问题分析
原脚本通过三次独立的WMI查询分别输出网络、系统、BIOS信息,导致同一计算机的信息分散在多行表格中;同时使用文本重定向输出,无法生成标准CSV格式。
修改后的脚本
Function Get-CInfo { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$InputFile, [Parameter(Mandatory=$true)] [string]$OutputFile ) # 读取输入文件,兼容TXT(每行一个计算机名)和CSV(列名需为ComputerName) $ComputerNames = if ($InputFile.EndsWith('.csv')) { Import-Csv -Path $InputFile | Select-Object -ExpandProperty ComputerName } else { Get-Content -Path $InputFile } $results = @() foreach ($Computer in $ComputerNames) { $Computer = $Computer.Trim() if ([string]::IsNullOrEmpty($Computer)) { continue } try { # 获取启用IP的网卡配置 $netAdapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $Computer -ErrorAction Stop | Where-Object { $_.IpEnabled -eq $true } # 获取系统版本信息 $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer -ErrorAction Stop # 获取BIOS序列号 $bios = Get-WmiObject -Class Win32_BIOS -ComputerName $Computer -ErrorAction Stop # 为每个网卡生成一条完整记录 foreach ($adapter in $netAdapters) { $results += [PSCustomObject]@{ HostName = $adapter.DNSHostName ?? $Computer MACAddress = $adapter.MACAddress IPAddress = $adapter.IPAddress -join ', ' OSVersion = $os.Caption SerialNumber = $bios.SerialNumber Status = 'Success' } } # 处理无启用IP网卡的情况 if (-not $netAdapters) { $results += [PSCustomObject]@{ HostName = $Computer MACAddress = $null IPAddress = $null OSVersion = $os.Caption SerialNumber = $bios.SerialNumber Status = '无启用IP的网卡' } } } catch { Write-Warning "无法连接计算机: $Computer - 错误: $($_.Exception.Message)" # 记录失败信息 $results += [PSCustomObject]@{ HostName = $Computer MACAddress = $null IPAddress = $null OSVersion = $null SerialNumber = $null Status = "失败: $($_.Exception.Message)" } } } # 导出为标准CSV文件 $results | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8 } # 调用示例: # 从TXT文件读取计算机列表,导出CSV # Get-CInfo -InputFile "C:\Users\scott.hoffman.w.tsc\Desktop\scripts\get-cinfo-tools\comp-list.txt" -OutputFile "C:\path\to\comp-details.csv" # 从CSV文件读取(CSV需包含ComputerName列) # Get-CInfo -InputFile "C:\path\to\computers.csv" -OutputFile "C:\path\to\comp-details.csv"
关键改动说明
- 统一信息展示:将三次WMI查询的结果合并到一个自定义对象中,确保同一计算机(或网卡)的所有信息在同一行记录中
- CSV输入输出:
- 输入支持TXT(每行一个计算机名)和CSV(列名为
ComputerName)两种格式 - 使用
Export-Csv生成标准CSV文件,替代原有的文本重定向,方便后续数据分析
- 输入支持TXT(每行一个计算机名)和CSV(列名为
- 异常处理增强:记录每台计算机的连接状态,失败时保留错误信息,便于排查问题
- 多网卡兼容:一台计算机有多个启用IP的网卡时,每个网卡对应一条独立记录,避免信息丢失
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

