очистить память / буфер PowerShell, запускающий бесконечный цикл каждые 3 секунды - PullRequest
0 голосов
/ 03 марта 2019

Я создал скрипт powershell, который просто анализирует файл журнала, и если в последней строке содержится ключевое слово «error», он отправляет электронное письмо и запускает крошечный макрос мыши - цикл повторяется каждые 3 секунды - бесконечный цикл

if ($lastSent -ne $currentLine -and $currentLine -match "Error") {
            if ($currentLine -match "Error23") {
                [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(225, 305)
                sleep -Seconds 01
                $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
                $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
                sleep -Seconds 01
                [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)
                sleep -Seconds 01
                $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
                $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
                sleep -Seconds 01

}

Я тестировал в прошлом, оставил приложение запущенным на несколько дней, и все было в порядке, теперь оно запускает приложение и этот сценарий powershell.

, однако после 12 ч. До 18 ч.иногда даже день или около того компьютер зависает, и я не могу RDP или ping, или что-то еще, полностью зависает - так это вызывает скрипт powershell.

Может кто-нибудь сказать мой любой PowerShell cmd или что-то, к чему я могу добавить егоцикл, который очищает память или буфер

Спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Если вы не вносили никаких изменений в сценарий, и в прошлом он работал нормально, то IMHO, сценарий не будет моей первой целью устранения неполадок.

Что-то изменилось в вашей системе.Это означает, что приложение или сам хост.

Вы можете форсировать сборку мусора, это один из способов ...

### Clear resource environment

Function Clear-ResourceEnvironment
{
    # Clear any PowerShell sessions created
    Get-PSSession | Remove-PSSession

    # Release an COM object created
    $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$Shell)

    # Perform garbage collection on session resources 
    [System.GC]::Collect()         
    [GC]::Collect()
    [GC]::WaitForPendingFinalizers()

    # Remove any custom varialbes created
    Get-Variable -Name MyShell -ErrorAction SilentlyContinue | Remove-Variable
}

Лично я действительно не могу себе представить, почему вы выбираете этот подход, вместо того, чтобы делать это постоянным наблюдателем WMI или сказать, что делаетеэто ...

Мониторинг журнала в режиме реального времени ...

# Take action as soon as the incoming line equals error
Get-Content -Path .\SomeLogFileName -Wait -Tail 0 | 
Where-Object {$_ -match 'error'}

Почему вы звоните по этому номеру несколько раз?

[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)
sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);

Позвоните этому ...

[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(60, 305)

... вверху вашего скрипта.

Сделайте эту ...

sleep -Seconds 01
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
sleep -Seconds 01

... функцией и вызовите функцию против дублирующего кодаИтак, что-то вроде.

Function Send-MouseClick
{
    sleep -Seconds 01
    $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
    $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
    sleep -Seconds 01    
}

if ($lastSent -ne $currentLine -and $currentLine -match "Error") 
{
    if ($currentLine -match "Error23") {
    Send-MouseClick
}

Просто некоторые идеи с моей головы, но явно не проверенные.

...