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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:27:27