PowerShell输出到文本文件截断、格式错误及多命令写同文件问题
PowerShell 设备信息导出文本异常修复
异常根因
- 输出
Microsoft.PowerShell.Commands.Internal.Format.*类型名:Format-Table等格式cmdlet输出的是专用格式对象而非纯文本,未经过宿主渲染直接写入文件时,会直接序列化对象类型名。 - 内容被
...截断:PowerShell默认格式化逻辑会根据当前控制台宽度截断超长字段,直接输出对象到文件、或Format-Table未指定足够宽度时都会触发该问题。
实现方案
方案1:导出人工可读的格式化日志
适合需要直接查看内容的日志场景,通过Out-String -Width指定足够大的输出宽度避免截断,统一追加到同一文件即可。
# 统一配置路径和编码 $logPath = "C:\Users\$env:UserName\Desktop\Devices\output.txt" $logEncoding = [System.Text.Encoding]::UTF8 # 初始化日志文件(清空旧内容) Set-Content -Path $logPath -Value "=== 设备信息导出日志 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ===" -Encoding $logEncoding # 读取待查询的打印机名称列表 $PrinterList = Get-Content "C:\Users\$env:UserName\Desktop\Devices\printerlist.txt" # 写入打印机设备信息 "`n=== 打印机设备列表 ==`n" | Add-Content -Path $logPath -Encoding $logEncoding Get-PnpDevice -PresentOnly -FriendlyName $PrinterList | Format-Table -AutoSize | Out-String -Width 4096 | Add-Content -Path $logPath -Encoding $logEncoding # 追加写入USB设备PID/VID信息(示例:多命令追加逻辑) "`n=== USB设备列表 ==`n" | Add-Content -Path $logPath -Encoding $logEncoding Get-PnpDevice -PresentOnly -Class USB | Select-Object FriendlyName, InstanceId, Status | Format-Table -AutoSize | Out-String -Width 4096 | Add-Content -Path $logPath -Encoding $logEncoding
关键参数说明:Out-String -Width 4096会将格式化后的表格转为宽度4096字符的纯文本,足够容纳绝大多数设备名称、ID字段,不会出现截断。
方案2:导出结构化数据(适合二次处理)
如果导出的内容需要后续脚本解析、或用Excel打开查看,直接导出CSV格式,完全不存在截断问题:
$csvPath = "C:\Users\$env:UserName\Desktop\Devices\device_list.csv" $PrinterList = Get-Content "C:\Users\$env:UserName\Desktop\Devices\printerlist.txt" # 写入打印机设备信息 Get-PnpDevice -PresentOnly -FriendlyName $PrinterList | Select-Object FriendlyName, InstanceId, Status, Class | Export-Csv -Path $csvPath -Encoding UTF8 -NoTypeInformation # 追加USB设备信息到同一CSV Get-PnpDevice -PresentOnly -Class USB | Select-Object FriendlyName, InstanceId, Status, Class | Export-Csv -Path $csvPath -Encoding UTF8 -NoTypeInformation -Append
原有写法的问题
- 直接将
Format-Table输出管道传给Out-File未指定宽度,默认使用控制台宽度(通常80-120字符)触发截断,且脱离控制台宿主时直接输出格式对象类型名。 - 直接将
Get-PnpDevice返回的对象传给Add-Content时,PowerShell会执行默认格式化,同样受宽度限制导致字段被...截断。
内容的提问来源于stack exchange,提问作者LordZeus
相关产品推荐
相关产品推荐

