深圳这两天在下雷暴雨,一个星期不到,脆弱的长城宽带的交换机已经连续被雷劈坏了两回了。今天上午一打开电脑,发现没法上网。查了下路由器,发现提示WAN口未连接。简单的排除了下故障,发现很有可能是长城宽带的交换机又被雷劈了。
又没法上网!无奈之下,只好去看书了。但一想,要是网络通了,我咋知道啊?挠了下脑袋,嘿嘿,咱可是程序员啊!用C#写个小程序,自动报警?费劲啊,噼里啪啦的得打开VS,中规中矩的敲一堆无用代码,编译,生成程序。。。No no no!咱怕麻烦,是懒人,嘿嘿,PowerShell上场吧!简单高效,能完成我的任务就行。简述下我的需求:网络正常后,需要让我知道!实现思路:ping一个网络上的远程主机,检测返回结果。若是可以到达,则播放录音文件通知我,否则,每隔一段时间间,继续尝试,直到用户手动停止执行或者网络正常为止。以下是简单实现,
<#
General description
This script is used to give a sound alarm when the network is repaired.
History
V1.0 stupidyzd 05252013 First draft
#>
cls
$ErrorActionPreference &#61; "stop"
# constants
$Global:playerPath &#61; "C:\&#96;"Program Files (x86)&#96;"\Baofeng\StormPlayer\StormPlayer.exe"
$Global:alarmAudioFileName &#61; "D:\Scripts\NetworkIsOK.wma"
$Global:remoteHost &#61; "www.baidu.com"
$Global:interval &#61; 10
# function definition area
function ShowMessage([string] $msgText)
{
$currentDateTimeString &#61; Get-Date -Format g
if($msgText.ToLower().IndexOf("error:") -ge 0)
{
Write-Host "$currentDateTimeString $msgText"
QuitPS
}
else
{
Write-Host "$currentDateTimeString $msgText"
}
}
function QuitPS()
{
Exit
}
function PlayAudio([string] $audioFileName)
{
$playAudioCommand &#61; "$playerPath $audioFileName"
Invoke-Expression -Command $playAudioCommand
}
function CheckNetwork()
{
$cmd &#61; "ping $remoteHost"
$networkOK &#61; $false
do
{
ShowMessage "INFO: Trying to reach $remoteHost..."
$commandResult &#61; &#64;(Invoke-Expression -Command $cmd) | ForEach-Object{
if($_.IndexOf("TTL&#61;") -ge 0)
{
$networkOK &#61; $true
break
}
}
Start-Sleep -Seconds $interval
}while(-not $networkOK)
while($true)
{
ShowMessage "INFO: Network is OK now!"
PlayAudio -audioFileName $Global:alarmAudioFileName
Start-Sleep -Seconds $interval
}
}
# main procedures
CheckNetwork
由于只是信手瞎写的一个小脚本&#xff0c;所以不是很规范&#xff0c;请同行不要见笑。下面就这个小脚本简单说两句。我主要是准备了一个自己的音频文件&#xff0c;并且借用了暴风影音来播放这个通知录音。脚本可以在Win8下面顺利执行(关于怎么去执行这个小脚本&#xff0c;后续博文会有提及这方面的知识)。下午2:14网络就通了。我顺利收到了消息 :)该博客也就由此而生了&#xff0c;以下是实图&#xff0c;