我有一个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
答案 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))