Powershell для отчетов о дисковом пространстве - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь написать PowerShell для создания отчетов о дисковом пространстве на всех моих серверах. Намерение состоит в том, чтобы запускать его как запланированное задание в полночь ежедневно, который будет экспортировать CSV, а также отправлять электронную почту, если место на рабочем месте составляет менее 10 процентов, электронное письмо будет содержать вложение самого последнего CSV report.

Проблема, с которой я столкнулся, - это электронная почта. Весь код ниже!

$OldReports = (Get-Date).AddDays(-30)

    #edit the line below to the location you store your disk reports# It might also
    #be stored on a local file system for example, D:\ServerStorageReport\DiskReport

    $messageParameters = @{                        
                    Subject = "Weekly Server Storage Report"                        
                    Body = "Attached is Weekly Server Storage Report. The scipt has been amended to return only servers with free disk space less than or equal to 10%. All reports are located in \\universalexplorer.net\REPORTS\ServerStorageReports$Env:COMPUTERNAMEDiskReport\, but the most recent  is sent weekly"                   
                    From = "<doNotReply@universalexplorer.net>"                        
                    To = "<jacob.pagano@universalexplorer.net>"
                    Attachments = (Get-ChildItem "\\universalexplorer.net\REPORTS\ServerStorageReports\DiskReport_$Env:COMPUTERNAME*" | sort LastWriteTime | select -last 1)                   
                    SmtpServer = "smarthost.universalexplorer.net"                        
                }

    Get-ChildItem "\\universalexplorer.net\REPORTS\ServerStorageReports\DiskReport_$Env:COMPUTERNAME*" | `
    Where-Object { $_.LastWriteTime -le $OldReports} | `
    Remove-Item -Recurse -Force -ErrorAction SilentlyContinue  

    #Create variable for log date

    $LogDate = get-date -f yyyyMMddhhmm

    Get-WmiObject -Class Win32_logicaldisk -Filter "DriveType = '3'" | 
    Select-Object -Property DeviceID, DriveType, VolumeName, 
    @{Label = "Drive Letter";Expression = {$_.DeviceID}},
    @{Label = "Total Capacity (GB)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}},
    @{Label = "Free Space (GB)";Expression = {"{0:N1}" -f ( $_.Freespace / 1gb ) }},
    @{Label = 'Free Space (%)'; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}} | Export-Csv -path "\\universalexplorer.net\REPORTS\ServerStorageReports\DiskReport_$Env:COMPUTERNAME'_'$logDate.csv" -NoTypeInformation

    Get-WmiObject -Class Win32_logicaldisk -Filter "DriveType = '3'" | Send-MailMessage @messageParameters -BodyAsHtml | Where-Object {($_.freespace/$_.size) -le '0.1'}

А вот фрагмент для части электронной почты.

Get-WmiObject -Class Win32_logicaldisk -Filter "DriveType = '3'" | Send-MailMessage @messageParameters -BodyAsHtml | Where-Object {($_.freespace/$_.size) -le '0.1'}

1 Ответ

1 голос
/ 05 апреля 2020

Ваш код не фиксирует результаты в переменной, поэтому впоследствии будет сложно проверить, нужно ли вам отправлять электронное письмо или нет. (теперь вам нужно выполнить Get-WmiObject во второй раз).

Кроме того, вы сравниваете число со строкой в ​​Where-Object {($_.freespace/$_.size) -le '0.1'}

Если я понимаю вопрос, код должен всегда создать отчет CSV-файл. Если в отчете указаны диски с менее чем 10% свободного дискового пространства, следует отправить электронное письмо.
Это письмо также следует отправлять, если это стандартный день для еженедельной почты.

Попробуйте:

$OldReports = (Get-Date).AddDays(-30).Date   # set this to midnight
$LogDate    = '{0:yyyyMMddhhmm}' -f (Get-Date)
$logPath    = '\\universalexplorer.net\REPORTS\ServerStorageReports'
$logFile    = Join-Path -Path $logPath -ChildPath ('DiskReport_{0}_{1}.csv' -f $env:COMPUTERNAME, $logDate)

# remove all old reports
Get-ChildItem -Path $logPath -Filter "DiskReport_$env:COMPUTERNAME*.csv" -File |
    Where-Object { $_.LastWriteTime -le $OldReports} |
    Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# get the disk info and capture the results in variable $result
$result = Get-WmiObject -Class Win32_logicaldisk -Filter "DriveType = '3'" | 
    Select-Object -Property DeviceID, DriveType, VolumeName, 
    @{Label = "Drive Letter";Expression = {$_.DeviceID}},
    @{Label = "Total Capacity (GB)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}},
    @{Label = "Free Space (GB)";Expression = {"{0:N1}" -f ( $_.Freespace / 1gb ) }},
    @{Label = 'Free Space (%)'; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}}

# output the report in a csv file. This will now of course be the most recent
$result | Export-Csv -Path $logFile -NoTypeInformation

# check the results to see if there are disks with less than 10% free space
$lowOnSpace = $result | Where-Object { [int]($_.'Free Space (%)' -replace '\D') -lt 10 }

# if today is the day to send the weekly report. For demo I'll use Monday
# also send if any of the disks have less than 10% free space
if (($lowOnSpace) -or (Get-Date).DayOfWeek -eq 'Monday') {
    # do the mailing stuff if needed
    $messageParameters = @{                        
        Subject     = "Weekly Server Storage Report"
        Body        = "Attached is Weekly Server Storage Report. The scipt has been amended to return only servers with free disk space less than or equal to 10%. All reports are located in $logPath, but the most recent  is sent weekly"
        From        = "<doNotReply@universalexplorer.net>"
        To          = "<jacob.pagano@universalexplorer.net>"
        Attachments = $logFile
        SmtpServer  = "smarthost.universalexplorer.net"
        BodyAsHtml  = $true        
    }
    Send-MailMessage @messageParameters
}

Надеюсь, это поможет

...