如何在while循环中捕获错误详细信息?

时间:2019-03-21 14:12:54

标签: powershell

我有一个PowerShell脚本,用于检查与IP地址的连接是否处于活动状态。我在代码中添加了一个计时器,因此它循环并检查4分钟,然后进入睡眠状态,然后重新开始。我还将此脚本添加到每5分钟运行一次的Task Scheduler中。

但是,我的问题是,如果错误发生在while循环之外,脚本只会捕获错误详细信息。如果代码循环时出现错误,则error变量为空,不幸的是,所有错误都在循环内发生。

这是我的代码。除上述以外,一切正常。有任何建议或答案吗?

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 个答案:

答案 0 :(得分:1)

没有$ 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))