Как захватить детали ошибки в цикле while? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть скрипт PowerShell, который проверяет, является ли соединение с IP-адресом живым. Я добавил таймер к коду, чтобы он зацикливался и проверял в течение 4 минут, затем спал, затем снова запускался. Я также добавил этот скрипт в планировщик задач, который запускается каждые 5 минут.

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

Это код, который у меня есть. Помимо вышесказанного все работает отлично. Есть предложения или ответы?

function Make_Decision() {
    if ($val -eq 0) {
        $msg = "Connection to [$IPaddress] FAILED`n"
        Add-Content -path C:\path\results.txt -value "[$date] - { $msg }"
        Send_Email_Groups
    }
}

function Test_Port_Connection() {
    $date = Get-Date -Format g
    $portNumber = 0000
    $IPaddress = '000.00.00.00'
    $timeout = New-TimeSpan -Minutes 4
    $sw = [Diagnostics.Stopwatch]::StartNew()
    $host_connection = New-Object System.Net.Sockets.TCPClient
    try {
        $host_connection.Connect($IPaddress, $portNumber)
    } catch {
        $erro = "[$date] - $_"
        $erro | Out-File C:\path\errors.txt -Append
    }
    while ($sw.elapsed -lt $timeout) {
        if (($host_connection.Connected) -and (Test-Connection -IPAddress $IPaddress -Count 1 -ErrorAction SilentlyContinue)) {
            $val = 1
        } else {
            $val = 0
            break
        }
        Start-Sleep -Seconds 1
    } # end of while loop
    Make_Decision
}

Test_Port_Connection

1 Ответ

1 голос
/ 21 марта 2019

Причина отсутствия переменной $ error заключается в том, что powershell вычисляет $host_connection.Connected, что в первую очередь неверно, поэтому второй оператор Test-Connection -IPAddress $IPaddress -Count 1 -ErrorAction SilentlyContinue никогда не запускается, и поэтому вывод никогда не назначается переменной $ error

Если вы переключите их, тогда тест будет запущен, и вы можете получить переменную ошибки из цикла while:

Вместо

if (($host_connection.Connected) -and (Test-Connection -IPAddress $IPaddress -Count 1 -ErrorAction SilentlyContinue))

у вас будет

if ((Test-Connection -IPAddress $IPaddress -Count 1 -ErrorAction SilentlyContinue) -and ($host_connection.Connected))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...