Как преобразовать значения свойств объекта PowerShell в фрагмент таблицы HTML? - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу использовать 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 значения, конечно, просто отображают то, что находится внутри фрагмента $.

Опять же ... вопрос Что я делаю неправильно, что препятствует заполнению фрагмента фактическими значениями вместо информации о форматировании таблицы?Я более чем готов попробовать предложения, конвертировать в другие типы объектов или попробовать другой подход, чтобы это произошло ... но, очевидно, отображение строки на странице HTML (единственный способ, которым я видел данные на странице HTML, сначала преобразующиесначала использовать $netver = $netver | out-string) - не читабельный вариант.

Я не думаю, что это имеет значение для этого примера, но сейчас я использую PS 3.0.

1 Ответ

0 голосов
/ 07 декабря 2018

С удаленным |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
...