PowerShell导出数据库表为CSV格式异常求助
问题:Azure VM执行SQL查询后无法生成正确CSV格式输出
问题现象
通过Invoke-AzVMRunCommand在Azure虚拟机上执行SQL查询,期望导出行列结构的CSV文件,但当前仅得到键值对形式的纯文本字符串;尝试用Export-CSV处理时,仅输出length字段,无法得到预期的表格型CSV。
当前脚本代码
$scriptCode = @' $query = "use test_MO; SELECT Quantity, 'License Metric', 'Product Name', 'Manufacturer (Article)', 'Manufacturer article number (Article)','Article description (Article)','Purchase requisition number','Order number','License status','Maintenance end date' FROM licenses lic " $sql_job = Invoke-Sqlcmd -ServerInstance $servername -Query "$Query" $sql_job '@ Remove-Item -Path "sqllicensereport.ps1" -Force New-Item -Path . -Name "sqllicensereport.ps1" -ItemType "file" -Value "$scriptCode" | out-null $runquery = Invoke-AzVMRunCommand -ResourceGroupName $ServerRGName -VMName $ServerName -CommandId 'RunPowerShellScript' -ScriptPath "sqllicensereport.ps1" -Parameter @{servername = $servername} $temp = $runquery.Value[0].Message | Format-Table -Auto > $outputFile
问题原因
- 虚拟机内的脚本直接输出
$sql_job对象,Invoke-AzVMRunCommand会将其转换为纯文本字符串返回,本地无法拿到原始对象,导致Export-CSV只能处理字符串的length属性。 - 使用
Format-Table处理纯文本,输出的是格式化后的文本,并非标准CSV结构。
解决方案
方案1:在虚拟机内直接生成CSV(推荐)
修改虚拟机内的脚本,将SQL查询结果直接转换为CSV字符串输出,本地直接保存即可:
$scriptCode = @' $query = @" use test_MO; SELECT Quantity, [License Metric], [Product Name], [Manufacturer (Article)], [Manufacturer article number (Article)], [Article description (Article)], [Purchase requisition number], [Order number], [License status], [Maintenance end date] FROM licenses lic "@ # 执行SQL查询并转换为CSV格式(去掉类型信息) $sql_job = Invoke-Sqlcmd -ServerInstance $servername -Query $Query $sql_job | ConvertTo-Csv -NoTypeInformation '@ Remove-Item -Path "sqllicensereport.ps1" -Force New-Item -Path . -Name "sqllicensereport.ps1" -ItemType "file" -Value $scriptCode | Out-Null $runquery = Invoke-AzVMRunCommand -ResourceGroupName $ServerRGName -VMName $ServerName -CommandId 'RunPowerShellScript' -ScriptPath "sqllicensereport.ps1" -Parameter @{servername = $servername} # 将VM返回的CSV文本直接写入文件 $runquery.Value[0].Message | Out-File $outputFile -Encoding utf8
说明:
- SQL查询中带空格/特殊字符的列名用
[]包裹,避免语法错误。 ConvertTo-Csv -NoTypeInformation直接将查询对象转换为标准CSV字符串,返回后本地无需额外处理。
方案2:本地解析纯文本生成CSV(无法修改VM脚本时使用)
如果无法调整虚拟机内的脚本,可在本地解析返回的纯文本,转换为对象后导出CSV:
# 获取VM返回的原始文本 $rawOutput = $runquery.Value[0].Message # 分割文本为单个记录块(以Quantity开头分割) $recordBlocks = $rawOutput -split '(?m)^[\s]+Quantity\s+:' | Where-Object { $_ -ne '' } # 解析每个记录块为对象 $results = foreach ($block in $recordBlocks) { $props = [ordered]@{} # 处理第一个缺失Quantity开头的记录块 if (-not $block.StartsWith('Quantity')) { $firstLine = $block -split ':', 2 | ForEach-Object { $_.Trim() } $props['License Metric'] = $firstLine[1] $remainingLines = $block -split "`n" | Select-Object -Skip 1 } else { $remainingLines = $block -split "`n" } # 逐行解析键值对 foreach ($line in $remainingLines) { if ($line -match '^\s*(.+?)\s*:\s*(.*)$') { $props[$matches[1].Trim()] = $matches[2].Trim() } } [PSCustomObject]$props } # 导出为标准CSV $results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8
说明:
- 通过正则分割和匹配解析纯文本中的键值对,转换为PowerShell对象后,即可用
Export-Csv生成正确的CSV。
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

