导出至CSV:如何将$ModelInfo与$SerialNumber合并为单行输出?
问题解决方法
你的问题根源在于分别导出两个独立的PowerShell对象,$ModelInfo和$SerialNumber是两个不同的对象,Export-Csv会把它们当作两条独立的记录写入CSV,所以会出现分行甚至属性错位的情况。
要让型号和序列号出现在同一行,你需要把这两个对象的属性合并成同一个自定义对象,再一次性导出。下面是修改后的脚本:
$LocalComputer = Read-Host "Enter Local Computer Name" $ComputerList = Import-Csv "\\$LocalComputer\c$\Scripts\Computerlist.Csv" foreach ($Computer in $ComputerList) { $PingTest = Test-Connection $Computer.Name -Count 1 -Quiet if (-not $PingTest) { Write-Host $Computer.name -ForegroundColor Red $Computer | Select-Object name | Export-Csv "\\$LocalComputer\C$\Scripts\FailedComputer.Csv" -Append -NoTypeInformation } else { Write-Host $Computer.name -ForegroundColor Green # 重启WinRM服务(若不需要可移除,或先检查状态再执行) Get-Service -ComputerName $Computer.name -Name winrm | Restart-Service Start-Sleep -Seconds 1 # 远程获取电脑型号和序列号,合并为单个对象 $computerDetails = Invoke-Command -ComputerName $Computer.name -ScriptBlock { $systemInfo = Get-WmiObject Win32_ComputerSystem | Select-Object Caption, Model $biosInfo = Get-WmiObject Win32_BIOS | Select-Object SerialNumber # 创建自定义对象整合所有所需属性 [PSCustomObject]@{ ComputerName = $env:COMPUTERNAME Caption = $systemInfo.Caption Model = $systemInfo.Model SerialNumber = $biosInfo.SerialNumber } } # 将整合后的对象导出到CSV $computerDetails | Export-Csv "\\$LocalComputer\C$\Scripts\Computers.Csv" -Append -NoTypeInformation } }
关键修改说明
- 重命名源列表变量为
$ComputerList,避免和循环变量$Computer重名(原脚本存在变量名冲突隐患) - 用一次
Invoke-Command同时获取系统和BIOS信息,减少远程调用次数、提升运行效率 - 通过
[PSCustomObject]把分散的属性合并为一个对象,确保CSV中每条记录包含所有需要的字段 - 添加
-NoTypeInformation参数,避免CSV开头出现冗余的类型信息行 - 简化
if条件判断(-not $PingTest更符合PowerShell语法习惯)
内容的提问来源于stack exchange,提问作者IT4Gov
相关产品推荐
相关产品推荐

