quinta-feira, 31 de agosto de 2017

NotifyIcon

Vamos utilizar o que aprendemos em post anterior para obter informações do sistema operacional para criarmos uma monitoria simples da quantidade de memória livre disponível.

Quando a memória livre estiver abaixo de percentual passado ao script, vamos exibir um balão (ballontip) na área de notificação do windows.

Para montarmos esse script, vamos precisar do seguinte.

Obtermos a quantidade de memória livre disponível, em percentual:
$Sistema = Get-Ciminstance Win32_OperatingSystem

$PercMemLivre = [math]::Round(($Sistema.FreePhysicalMemory/`
                  $Sistema.TotalVisibleMemorySize)*100,2)

Uma função que exiba um balão na área de notificação quando a memória livre estiver abaixo de um valor (em percentual) que especificarmos.
Function _ShowBalloon($PML) {
    $Notifica = New-Object System.Windows.Forms.NotifyIcon
               
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')
.
.
.
    $Notifica.ShowBalloonTip(10000)

} ### _ShowBalloon


O script completo poderia ser esse:
Function MemMonitor {
    [CmdletBinding()]
    Param
    (
      [Parameter(Mandatory=$true,`
      HelpMessage="Indica o tempo de monitoria da memória (em segundos). P.ex.: 60")]
      [ValidateRange(30,7200)]
      [Int]$TempoMonitoria,
      
      [Parameter(Mandatory=$true,`
      HelpMessage="Indica o percentual de memória livre mínima, aceitável como normal. P.ex.: 45")]
      [ValidateRange(20,80)] 
      [Int]$PercMemMin
    )
 
    Add-Type -AssemblyName System.Windows.Forms

    $HoraIni = Get-Date
    $Sistema = Get-Ciminstance Win32_OperatingSystem

    $isNotShowingBalloon = $true
    $HDif = 0
    for ($t=1; $t -le 100000; $t++) {
        $HoraAgora = Get-Date
        $HoraDif = NEW-TIMESPAN –Start $HoraIni End $HoraAgora
        $HDif += $HoraDif.Seconds
        Write-Host $HDif ' - ' $TempoMonitoria
        if ($HDif -ge $TempoMonitoria) {
            While ($isNotShowingBalloon -eq $false) {
                Start-Sleep -Seconds 1
            }
            exit
        }

        $PercMemLivre = [math]::Round(($Sistema.FreePhysicalMemory/`
                        $Sistema.TotalVisibleMemorySize)*100,2)

        if ($PercMemLivre -lt $PercMemMin) {
            if ($isNotShowingBalloon) {
                $isNotShowingBalloon = $false
                _ShowBalloon($PercMemLivre)
                $isNotShowingBalloon = $true
            } 
        }
        else {
            $isNotShowingBalloon = $true
        }
        Start-Sleep -Seconds 10
    }
}

Function _ShowBalloon($PML) {
    $Notifica = New-Object System.Windows.Forms.NotifyIcon
                    
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')

    if ($PML -gt 30) { 
        $Notifica.BalloonTipIcon = 'Warning' 
    }
    else {
        $Notifica.BalloonTipIcon = 'Error' 
    }
    $Notifica.BalloonTipText = [string]$PML + ' %'
    $Notifica.BalloonTipTitle = 'Memória Livre [%]'
    $Notifica.Text = [string]$PML + ' %'
    $Notifica.Visible = $true
    $Notifica.ShowBalloonTip(10000)
    Start-Sleep -Seconds 10
    $Notifica.Visible = $false
    $Notifica.Dispose()

} ### _ShowBalloon

if ($args.Length -lt 2)
{
    MemMonitor
}
else {
    MemMonitor -TempoMonitoria $args[0] -PercMemMin $args[1]
}


E o resultado da execução poderia ser, por exemplo.


Observe que foi utilizado um ícone para exibição na área de notificação.
O mesmo está referenciado na seguinte linha de código.
    $Notifica.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(`
    $PSScriptRoot + '\Img\Memory.ico')

Ainda, observe que é possível indicar um ícone para o balão (balloontip).
Nesse caso, estamos utilizando Warning quando a memória livre é maior do que 30, mas menor do que o valor especificado para monitorar.

E estamos utilizando Error para representar o ícone quando a memória livre, em percentual, for menor do que, ou igual a, 30.
    if ($PML -gt 30) { 
        $Notifica.BalloonTipIcon = 'Warning' 
    }
    else {
        $Notifica.BalloonTipIcon = 'Error' 
    }

Nenhum comentário:

Postar um comentário