我有一个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发布于 2019-03-22 00:48:12
之所以没有$error变量,是因为powershell首先计算的是$host_connection.Connected,它为false,因此第二个语句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))https://stackoverflow.com/questions/55282401
复制相似问题