我想使用PS创建带有多个表的HTML报告,这与对here的概括非常相似。我尝试了许多不同的方法,但是似乎无法正确获取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页面中的数据进行转换的唯一方式)首先使用$netver = $netver | out-string
)不是可读选项。
对于这个示例,我认为这并不重要,但目前我正在使用PS 3.0。
答案 0 :(得分:2)
删除|Format-Table
后,您应该会得到更好的结果,
当然mklements explanation比我的好。
$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