PowerShell Format-Table无法显示全部列的解决方法(含Azure Pipelines)
问题描述
我有一个包含32列的表,使用PowerShell的Format-Table输出时,大量列被截断。以下是创建该表及记录的脚本:
$sqlResult = Invoke-Sqlcmd -Query 'select * from Table_1' -ServerInstance '(localdb)\MSSQLLocalDB' -Database 'Database1' -OutputAs DataTables $sqlResult | Format-Table
对应的表结构及插入数据的SQL脚本:
USE [Database1] GO /****** Object: Table [dbo].[Table_1] Script Date: 9/14/2022 5:51:07 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table_1]( [Id] [int] IDENTITY(1,1) NOT NULL, [Column1] [nvarchar](50) NULL, [Column2] [nvarchar](50) NULL, [Column3] [nvarchar](50) NULL, [Column4] [nvarchar](50) NULL, [Column5] [nvarchar](50) NULL, [Column6] [nvarchar](50) NULL, [Column7] [nvarchar](50) NULL, [Column8] [nvarchar](50) NULL, [Column9] [nvarchar](50) NULL, [Column10] [nvarchar](50) NULL, [Column11] [nvarchar](50) NULL, [Column12] [nvarchar](50) NULL, [Column13] [nvarchar](50) NULL, [Column14] [nvarchar](50) NULL, [Column15] [nvarchar](50) NULL, [Column16] [nvarchar](50) NULL, [Column17] [nvarchar](50) NULL, [Column18] [nvarchar](50) NULL, [Column19] [nvarchar](50) NULL, [Column20] [nvarchar](50) NULL, [Column21] [nvarchar](50) NULL, [Column22] [nvarchar](50) NULL, [Column23] [nvarchar](50) NULL, [Column24] [nvarchar](50) NULL, [Column25] [nvarchar](50) NULL, [Column26] [nvarchar](50) NULL, [Column27] [nvarchar](50) NULL, [Column28] [nvarchar](50) NULL, [Column29] [nvarchar](50) NULL, [Column30] [nvarchar](50) NULL, [Column31] [nvarchar](50) NULL, [Column32] [nvarchar](50) NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET IDENTITY_INSERT [dbo].[Table_1] ON GO INSERT [dbo].[Table_1] ([Id], [Column1], [Column2], [Column3], [Column4], [Column5], [Column6], [Column7], [Column8], [Column9], [Column10], [Column11], [Column12], [Column13], [Column14], [Column15], [Column16], [Column17], [Column18], [Column19], [Column20], [Column21], [Column22], [Column23], [Column24], [Column25], [Column26], [Column27], [Column28], [Column29], [Column30], [Column31], [Column32]) VALUES (1, N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903', N'12345678901234567890212345678903') GO SET IDENTITY_INSERT [dbo].[Table_1] OFF GO
如何在以下场景中以表格格式输出所有列?
- PowerShell 5.1 ISE或其他控制台;
- Azure Pipelines日志中。
解决方案
1. PowerShell 5.1 ISE/控制台场景
方法1:调整Format-Table参数适配列宽
Format-Table默认会根据控制台宽度截断列,添加-AutoSize让PowerShell自动根据内容分配列宽,搭配-Wrap让过长内容换行显示,避免列被直接截断:
$sqlResult | Format-Table -AutoSize -Wrap
如果控制台窗口宽度足够,所有列会完整显示;窗口较窄时,内容会换行保留完整信息。
方法2:导出到文件查看完整内容
如果控制台显示空间有限,可将结果导出到CSV或文本文件,用编辑器打开查看:
# 导出为CSV(可直接用Excel打开) $sqlResult | Export-Csv -Path "C:\temp\full_table.csv" -NoTypeInformation # 导出为格式化文本,设置足够大的宽度避免截断 $sqlResult | Format-Table -AutoSize -Wrap | Out-File "C:\temp\full_table.txt" -Width 4096
方法3:使用Out-GridView(仅GUI环境可用)
在PowerShell ISE这类带图形界面的环境中,用Out-GridView生成可交互的表格窗口,支持滚动查看所有列:
$sqlResult | Out-GridView
2. Azure Pipelines日志场景
Azure Pipelines日志默认宽度有限,推荐以下方式输出完整列:
方法1:输出为Markdown表格
Azure Pipelines支持渲染Markdown表格,将结果转换为Markdown格式输出,日志会自动排版成可读表格:
# 生成表头和分隔线 $headers = $sqlResult[0].PSObject.Properties.Name -Join " | " $separator = ($sqlResult[0].PSObject.Properties.Name | ForEach-Object { "---" }) -Join " | " # 生成每行内容 $rows = $sqlResult | ForEach-Object { $_.PSObject.Properties.Value -Join " | " } # 输出完整Markdown表格 "| $headers |" "| $separator |" $rows | ForEach-Object { "| $_ |" }
方法2:输出为JSON格式
将结果转换为JSON输出,Azure Pipelines日志会保留完整结构,方便复制后用JSON工具查看:
$sqlResult | ConvertTo-Json -Depth 10
-Depth参数确保嵌套结构(如果有)被完整转换,设置为10足够覆盖普通表结构。
方法3:纵向输出键值对表格
如果横向宽度不足,可将每列的键值对纵向排列,避免截断:
# 标记日志开始 Write-Host "##vso[task.logissue type=warning;]查询结果:" Write-Host "| 列名 | 值 |" Write-Host "| --- | --- |" # 逐行输出每列的键值对 $sqlResult | ForEach-Object { $row = $_ $row.PSObject.Properties | ForEach-Object { Write-Host "| $($_.Name) | $($_.Value) |" } Write-Host "| --- | --- |" # 分隔不同行数据 }
内容的提问来源于Stack Exchange,提问作者Rod
相关产品推荐
相关产品推荐

