PowerShell的Export-CSV命令无查询结果时不输出表头如何解决
解决Export-CSV无查询结果时不输出表头的问题
PowerShell 原生Export-Csv命令的默认逻辑是只有接收到至少一个输入对象时,才会解析对象属性生成表头并写入文件,若管道无输入则不会生成任何文件内容,这就是无查询结果时表头丢失的原因。
你可以通过先缓存查询结果、无结果时手动传入匹配列结构的空对象的方式解决,示例代码如下:
Set-Location c: # 先将查询结果存入变量,不直接管道传给Export-Csv $dbResults = Invoke-Sqlcmd -Query "SELECT * FROM MY_TABLE my;" -ServerInstance "myserver.fake" -Database "db" -Username "user" -Password "password" -Querytimeout 65535 $outputPath = "\\MyDirectory\MyResults.csv" if ($null -eq $dbResults) { # 无结果时构造和查询列完全匹配的空对象,列名需和你查询返回的列名/别名完全一致 $emptyRecord = [PSCustomObject]@{ # 示例列,替换为你实际的查询列即可 ID = $null NAME = $null CREATE_TIME = $null # 其余列按相同格式补全 } $emptyRecord | Export-Csv -Path $outputPath -NoTypeInformation } else { $dbResults | Export-Csv -Path $outputPath -NoTypeInformation }
如果不想手动维护列名,也可以通过查询表元数据自动生成空对象,通用代码如下:
Set-Location c: $server = "myserver.fake" $db = "db" $username = "user" $password = "password" $tableName = "MY_TABLE" $query = "SELECT * FROM $tableName my;" $outputPath = "\\MyDirectory\MyResults.csv" # 执行业务查询 $dbResults = Invoke-Sqlcmd -Query $query -ServerInstance $server -Database $db -Username $username -Password $password -Querytimeout 65535 if ($null -eq $dbResults) { # 查询表结构自动获取列名 $schemaQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'$tableName' ORDER BY ORDINAL_POSITION" $columnList = Invoke-Sqlcmd -Query $schemaQuery -ServerInstance $server -Database $db -Username $username -Password $password | Select-Object -ExpandProperty COLUMN_NAME # 自动生成对应结构的空对象 $emptyRecord = [PSCustomObject]@{} foreach ($col in $columnList) { $emptyRecord | Add-Member -MemberType NoteProperty -Name $col -Value $null } $emptyRecord | Export-Csv -Path $outputPath -NoTypeInformation } else { $dbResults | Export-Csv -Path $outputPath -NoTypeInformation }
注意:如果你的业务查询使用了列别名、关联多表或者只查询了部分字段,需要对应调整空对象的列定义,保证和业务查询返回的列完全一致。
内容的提问来源于stack exchange,提问作者Jonathan Otter
相关产品推荐
相关产品推荐

