powershell - 如何将 PowerShell 对象属性值转换为 HTML 表格片段?
问题描述
我想使用 PS 创建一个包含多个表格的 HTML 报告,类似于这里非常简洁地总结的内容。我尝试了许多不同的方法,但是我似乎无法获得正确填充 HTML 表格片段的值。
我错过了什么或做错了什么?
以一张小表为例,假设我想列出系统上已安装的 .NET 版本。
我可以使用以下方法填充对象数组:
$netver = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select PSChildName, Version, Release |ft;
...并且值正确存在(仅检查$netver
)。
根据引用的页面,以及引用相同的其他页面,我应该只需要执行以下操作:
$netverhtml = $netver | ConvertTo-Html -AS Table -Fragment -Property * | out-string;
...并且在构建最终的 html 页面时应该准备好包含该片段,类似于此...
ConvertTo-HTML -body "$netverhtml" | Out-File $logfile
...然而,即使在我到达那里之前,片段 ( $netverhtml
) 也不包含数据(类似于 中的内容$netver
),更不用说最终构建 html 页面时了。
除非我使用字符串,否则我会一直在 HTML 表结构中格式化数据(最终结果如下)。
<table>
<colgroup><col/><col/><col/><col/><col/><col/></colgroup>
<tr><th>ClassId2e4f51ef21dd47e99d3c952918aff9cd</th><th>pageHeaderEntry</th><th>pageFooterEntry</th><th>autosizeInfo</t
h><th>shapeInfo</th><th>groupingEntry</th></tr>
<tr><td>033ecb2bc07a4d43b5ef94ed5a35d280</td><td></td><td></td><td></td><td>Microsoft.PowerShell.Commands.Internal.Form
at.TableHeaderInfo</td><td></td></tr>
<tr><td>9e210fe47d09416682b841769c78b8a3</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>27c87ef9bbda4f709f6b4002fa4af63c</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>4ec4f0187cb04f4cb6973460dfe252df</td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>cf522b78d86c486691226b40aa69e95c</td><td></td><td></td><td></td><td></td><td></td></tr>
</table>
即使$netver
是一个对象数组,我也尝试过创建新的 PSObject,尝试不同的方法来使用正确的值填充对象属性......
$tableobjs = @();
foreach ($n in $netver){
$tmpname = ($n).pschildname;
$tmpver = $n.version|out-string;
$tmprel = $n.release;
$tableobjs += New-Object -Type PSObject -Prop @{
'PSChildName'='$tmpname';
'Version'='$tmpver';
'Release'='$tmprel';
}}`
但无论我尝试了什么,这些值都不会填充每个对象。它似乎遍历每个对象一次(因为行数相同),但值(来自$netver
)只是不填充对象。
PS C:\> $tableobjs
Version Release PSChildName
------- ------- -----------
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
$tmpver $tmprel $tmpname
当我在 HTML 正文中显示它们时,这些值当然只是显示 $fragment 中的内容。
再次......问题是我做错了什么阻止片段填充实际值,而不是表格格式信息?我非常愿意尝试建议,转换为其他对象类型,或尝试另一种方法来实现这一点......但显然在 HTML 页面中显示一个字符串(我看到 HTML 页面中的数据首先转换的唯一方法using $netver = $netver | out-string
first) 不是一个可读的选项。
我认为这个例子并不重要,但我目前使用的是 PS 3.0。
解决方案
删除后|Format-Table
,您应该会得到更好的结果,
当然mklements 的解释比我的要好。
$netver = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select PSChildName, Version, Release
$netverhtml = $netver| ConvertTo-Html -AS Table -Fragment -Property *
ConvertTo-HTML -body "$netverhtml" | Out-File $logfile
推荐阅读
- python - 基于列分布随机抽样 Pandas 数据帧
- go - 理解 Go 中的变量作用域
- ms-access - Access 2016 中缺少另存为选项
- java - 设置spark连接超时的最简单方法
- api - 企业 Zenhub API 在尝试访问存储库时返回“消息”:“标头中缺少身份验证令牌”
- asp.net-core - IdentityServer4-挑战对 API 的所有请求,而不仅仅是 [授权]
- javascript - 如何仅显示用户从组件写入另一个组件的文本?
- kubernetes - kong 入口控制器对入口资源没有影响
- c++ - 对象超出范围/转移所有权
- sql - 通过 SQL Server 角色或 Windows 组实施安全性