#html #powershell #dictionary
#HTML #powershell #словарь
Вопрос:
Мне нужно сообщить количество снимков виртуальных машин в зависимости от их возраста. Для этого я создал упорядоченный словарь, содержащий другой словарь, подобный этому (вывод json):
{ "Less than 24h": { "Prod": 15, "Other": 11 }, "1 day": { "Prod": 29, "Other": 12 }, "2 days": { "Prod": 11, "Other": 0 }, "3 days and more": { "Prod": 0, "Other": 0 } }
Мне нужно преобразовать его в html, чтобы включить в письмо. Я нахожу, как преобразовать «простой» словарь :
$Body1 = $dict.GetEnumerator() | Select-Object Key,Value | ConvertTo-Html -Fragment | Out-String $Body1 = $Body1.Replace('Key','Days').Replace('Value','Number of Snapshot')
И это работает нормально, но не в том случае, если значения являются вложенными словарями. Для вложенного словаря вывод будет выглядеть следующим образом :
| Days | Number of Snapshot | |-----------------|------------------------------------------------| | Less than 24h |`System.Collections.Specialized.OrderedDictionary`| | 1 day |`System.Collections.Specialized.OrderedDictionary`| | 2 days |`System.Collections.Specialized.OrderedDictionary`| | 3 days and more |`System.Collections.Specialized.OrderedDictionary`|
Есть ли способ получить такой html-вывод?
| Days | Prod | Other | |-----------------|------|-------| | Less than 24h | 15 | 11 | | 1 day | 29 | 12 | | 2 days | 11 | 0 | | 3 days and more | 0 | 0 |
Ответ №1:
Один из вариантов-предварительно обработать ваш словарь и преобразовать его во что-то другое, что может быть немного проще преобразовано в html:
$data = $dict.GetEnumerator() | foreach-object { new-object pscustomobject -property ([ordered] @{ "Days" = $_.Key "Prod" = $_.Value.Prod "Other" = $_.Value.Other }) }
Это приведет к выравниванию вашей вложенной структуры в этот эквивалент json:
[ { "Days": "2 days", "Prod": 11, "Other": 0 }, { "Days": "1 day", "Prod": 29, "Other": 12 }, { "Days": "Less than 24h", "Prod": 15, "Other": 11 }, { "Days": "3 days and more", "Prod": 0, "Other": 0 } ]
И тогда вы можете просто преобразовать все это за один раз без -Fragment
:
$Body1 = $data | ConvertTo-Html
что дает:
lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"gt; lt;html xmlns="http://www.w3.org/1999/xhtml"gt; lt;headgt; lt;titlegt;HTML TABLElt;/titlegt; lt;/headgt;lt;bodygt; lt;tablegt; lt;colgroupgt;lt;col/gt;lt;col/gt;lt;col/gt;lt;/colgroupgt; lt;trgt;lt;thgt;Dayslt;/thgt;lt;thgt;Prodlt;/thgt;lt;thgt;Otherlt;/thgt;lt;/trgt; lt;trgt;lt;tdgt;2 dayslt;/tdgt;lt;tdgt;11lt;/tdgt;lt;tdgt;0lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;1 daylt;/tdgt;lt;tdgt;29lt;/tdgt;lt;tdgt;12lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;Less than 24hlt;/tdgt;lt;tdgt;15lt;/tdgt;lt;tdgt;11lt;/tdgt;lt;/trgt; lt;trgt;lt;tdgt;3 days and morelt;/tdgt;lt;tdgt;0lt;/tdgt;lt;tdgt;0lt;/tdgt;lt;/trgt; lt;/tablegt; lt;/bodygt;lt;/htmlgt;
или
Дни | Подгонять | Другое |
---|---|---|
2 дня | 11 | 0 |
1 день | 29 | 12 |
Менее 24 часов | 15 | 11 |
3 дня и более | 0 | 0 |
Комментарии:
1. @KarimKanoun — Не беспокойтесь. Кстати, будет лучше, если вы немного подождете, прежде чем принять ответ, на случай, если появится лучший. Если вы отметили ответ, вы, как правило, заставите меньше людей переходить по нему, чтобы прочитать ваш вопрос…
2. Я согласился, потому что попробовал это в своем сценарии, и я получаю почту так, как хотел :). Но одно :
-Frangment
является обязательным, потому$Body1
что является частью HTML, и я сохранил его в своем коде, и все работает отлично.