Групповое имя виртуальной машины и отправка в одно электронное письмо с одинаковым адресом электронной почты в CSV.

Я только начинаю работать с PowerCLI. Попытка написать сценарий, который получает имя виртуальной машины в CSV, проверяет гостевые диски виртуальной машины с менее чем 20% свободного места и отправляет электронное письмо на адрес электронной почты, указанный в CSV. Однако мне трудно сгруппировать «имя» в одно электронное письмо с одинаковым адресом электронной почты.

Ниже приведен сценарий, который я использую для вывода списка гостевых дисков виртуальной машины, которые менее 20%.

import-csv ".\vm.csv"  | Group-Object $_."email"

ForEach ($VM in Get-VM $_."name" ){($VM.Extensiondata.Guest.Disk | `
Select @{N="Name";E={$VM.Name}},DiskPath, `
@{N="Capacity(MB)";E={[math]::Round($_.Capacity/ 1MB)}}, `
@{N="Free Space(MB)";E={[math]::Round($_.FreeSpace / 1MB)}} ,`
@{N="Free Space %";E={[math]::Round(((100* ($_.FreeSpace))/ ($_.Capacity)),0)}} | Where-Object {($_."Free Space %" -lt 20)})} 

Например в CSV:

name   email    
vm1    [email protected]
vm2    [email protected]
vm3    [email protected]
vm4    [email protected]

Выход:

email received by [email protected]
   No  VM    Free%
    1. vm1    10
    2. vm3     9

email received by [email protected]
   No  VM    Free%
    1. vm2     13
    2. vm4     15

Цените, если кто-нибудь может помочь.

Спасибо.


person Ally    schedule 10.11.2017    source источник


Ответы (1)


попробуйте что-то вроде этого:

Function SendSimpleMail 
{ 
             # Déclaration des paramètres 
             param([string]$Objet, [string]$Message, [string[]]$ToMail)

$SmtpServer="yoursmtpname"
$encoding=[System.Text.Encoding]::UTF8
$FromMail="from@domain"

Send-MailMessage -To $ToMail -Subject $Objet -Body $Message -SmtpServer $SmtpServer -From $FromMail -Encoding $encoding

}

import-csv ".\vm.csv"  | %{
$VM=Get-VM $_.name
$Email==$_.email
$VM.Extensiondata.Guest.Disk | %{
                                [pscustomobject]@{
                                Email=$Email
                                Name=$VM.Name
                                DiskPath=$_.DiskPath
                                "Capacity(MB)"=[math]::Round($_.Capacity/ 1MB)
                                "Free Space(MB)"=[math]::Round($_.FreeSpace / 1MB)
                                "Free Space %"=if ($_.Capacity -eq 0) {0} else {[math]::Round(((100* ($_.FreeSpace))/ ($_.Capacity)),0)}
                                }
}

} | group Email | %{

$body=$_.group | Out-String
SendSimpleMail "subject" $body $_.Name

}
person Esperento57    schedule 10.11.2017
comment
Привет, Esperento57, спасибо за твой скрипт. Он показал ошибку, как показано ниже, когда я выполняю скрипт. Attempted to divide by zero. At line:18 char:33 + [pscustomobject]@{ + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException . Пожалуйста, совет. - person Ally; 13.11.2017
comment
Могу ли я узнать, для чего предназначен % и как я могу сделать отображение в формате таблицы html? - person Ally; 13.11.2017
comment
Круто, это работа. Можете ли вы показать, как поместить строку вывода в формат таблицы? Я хочу поместить в таблицу для удобного просмотра, когда дойду до длинного списка. Я много раз пытался вставить html, но смог показать только одну запись в таблице. Оцените, если бы вы могли показать. - person Ally; 13.11.2017
comment
В Send-MailMessage добавьте -BodyAsHtml и создайте свой html для переменной body. Вы также можете попробовать $body=$_.group | ConvertTo-Html - person Esperento57; 13.11.2017
comment
Все та же ошибка, Attempted to divide by zero. At C:\Users\\Desktop\test.ps1:18 char:33 + [pscustomobject]@{ + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException - person Ally; 14.11.2017
comment
Я добавил HTML для переменной тела, которая может быть указана в таблице форматов, но не может перечислить список номеров для каждой строки. Любой метод, который я могу перечислить? - person Ally; 14.11.2017