如何将PowerShell输出的自定义对象转换为Markdown表格文件
实现方案
首先纠正一个命令使用误区:ConvertFrom-Markdown的作用是将已有的Markdown内容解析为PowerShell对象,你需要的是PowerShell自定义对象转Markdown表格,有两种可行实现:
方案1:PowerShell 7+ 原生命令实现(推荐)
PowerShell 7及以上版本自带ConvertTo-Markdown命令,直接输出对象数组即可自动生成标准Markdown表格。
修改后完整代码:
$xmlPath = 'C:\\Users\\jonb\\Desktop\\bom.xml' $ns = @{a = 'http://cyclonedx.org/schema/bom/1.2'} $xPath = '//a:component' $components = Select-Xml -Path $xmlPath -XPath $xPath -Namespace $ns # 初始化结果数组 $results = @() foreach ($component in $components) { $name = (Select-Xml -Xml $component.Node -XPath './/a:name/text()' -Namespace $ns).Value $version = (Select-Xml -Xml $component.Node -XPath './/a:version/text()' -Namespace $ns).Value $lic_cond = (Select-Xml -Xml $component.Node -XPath './/a:license/a:id/text()' -Namespace $ns).Value $license = If ($lic_cond) {$lic_cond} Else {"NA"} $finalObject = [pscustomobject]@{ 'Name' = $name 'Version' = $version 'License' = $license } $results += $finalObject } # 直接打印Markdown表格 $results | ConvertTo-Markdown # 如果要保存到本地文件可使用以下代码 # $results | ConvertTo-Markdown | Out-File -FilePath "C:\Users\jonb\Desktop\components.md" -Encoding utf8
方案2:PowerShell 5.1 及更低版本手动实现
如果你的运行环境是低版本PowerShell,没有原生转换命令,可以自定义转换函数实现:
完整代码:
# 自定义Markdown表格转换函数 function ConvertTo-MDTable { [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [PSObject[]]$InputObject ) begin { $objects = @() } process { $objects += $InputObject } end { # 生成表头 $headers = $objects[0].PSObject.Properties.Name "| $($headers -join ' | ') |" # 生成表头分隔线 "| $($headers | ForEach-Object { '-' * $_.Length } -join ' | ') |" # 生成每行数据 foreach ($obj in $objects) { $row = $headers | ForEach-Object { $obj.$_ } "| $($row -join ' | ') |" } } } $xmlPath = 'C:\\Users\\jonb\\Desktop\\bom.xml' $ns = @{a = 'http://cyclonedx.org/schema/bom/1.2'} $xPath = '//a:component' $components = Select-Xml -Path $xmlPath -XPath $xPath -Namespace $ns $results = @() foreach ($component in $components) { $name = (Select-Xml -Xml $component.Node -XPath './/a:name/text()' -Namespace $ns).Value $version = (Select-Xml -Xml $component.Node -XPath './/a:version/text()' -Namespace $ns).Value $lic_cond = (Select-Xml -Xml $component.Node -XPath './/a:license/a:id/text()' -Namespace $ns).Value $license = If ($lic_cond) {$lic_cond} Else {"NA"} $finalObject = [pscustomobject]@{ 'Name' = $name 'Version' = $version 'License' = $license } $results += $finalObject } # 调用自定义函数生成表格 $results | ConvertTo-MDTable
补充说明
你原有代码中Select-Xml返回的是SelectXmlInfo类型对象,直接赋值给属性会携带多余上下文信息,代码中新增的.Value是为了直接提取匹配到的文本内容,保证表格输出格式正常。
内容的提问来源于stack exchange,提问作者bobby17jones
相关产品推荐
相关产品推荐

