PowerShell 5.1执行两条筛选命令时输出结果未按预期分隔显示
问题原因
PowerShell 5.1 的默认输出格式化逻辑会对连续输出的同结构对象复用表头,减少重复冗余内容。你两次筛选得到的是结构完全一致的DataRow对象,连续输出时系统会判定属于同一块格式化内容,第二次结果不会重复渲染表头,也不会自动插入分隔空行,最终就出现了两个结果共用一套表头、连在一起显示的现象。
修复方案
核心思路是强制让两次输出走独立的格式化流程,手动插入空行做分隔即可,直接在每个输出语句后显式调用Format-Table就能触发独立渲染:
$res = Invoke-Sqlcmd -Query "select * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables $res | Where-Object FirstName -eq "John" | Format-Table "" $res.Where({$_.FirstName -eq "John"}) | Format-Table
如果需要把带格式的结果存到变量而不是直接打印到控制台,可以搭配Out-String把单次格式化后的内容转成文本,再拼接空行:
$res1 = $res | Where-Object FirstName -eq "John" | Format-Table | Out-String $res2 = $res.Where({$_.FirstName -eq "John"}) | Format-Table | Out-String $combined = $res1 + "`r`n" + $res2 $combined
运行后输出效果和预期完全一致:
Id FirstName City -- --------- ---- 1 John Augusta Id FirstName City -- --------- ---- 1 John Augusta
注意:
Format-Table等格式化命令返回的是展示用的格式对象,不是原始的DataRow数据,只能用于最终输出环节,不要把格式化后的结果拿去做后续的数据筛选、处理操作。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

