您现在的位置: 天下网吧 >> 网吧天地 >> 天下码农 >> 架构师 >> 正文

用au3写开机维护通道(实例),学习au3的来看

2008-11-17wglmthinking
事实证明,当有任务需要我们用程序来解决,或者以实例出发是最好的学习程序设计的方法。在解决问题的过程中学习函数的用法、编程思想等激发起的兴趣又可以进一步让人去学习基础知识的冲动,基础知识(内功)的扎实,又可以进一步优化我们的程序让其效率更高,代码更优美,逻辑更清晰。如此循环,他日定成正果,跳出三界外,不在五行中。

  所以,这一章,我们还是以实例开始,我们这第一章第四节(01-04)的目的是要写一个比较完美的开机维护通道启动程序。

  先来看看,我们需要实现一些什么功能?

  1,开机启动服务器上批处理。
  2,运行批处理不显示控制台窗口(俗称黑框框)
  3,考虑服务器关机的情况。(或者说是客户机开机网络连接延时判断)
  4,如果考虑这个程序给别的朋友用,那么我们势必要写个配置文件来实现通用。

  那么这一章我们就要以上几点带来的问题解决方案,函数等。其中涉及au3的,运行程序,运行参数,ping,判断语句,循环语句,用户自定函数,配置读取。概念有这么些,但是,相当简单,下面我们以实例开始。

(我建议在大家先安装好au3,并且打开帮助文件,在下面的学习中不懂的函数可以直接在帮助中搜索,看一下帮助的内容,再看一下在实际中如何应用,很容易掌握如何利用au3来控制计算机,也就是学会au3。)

  1,开机启动服务器上批处理。
  首先在代码第一行加入
#include <Process.au3>
表示包含process.au3这个文件,好使用其中的自定义函数 _RunDOS
假设为我们服务器上的批处理所在位置是
那么我们的第二行代码就是:
_RunDOS("\\192.168.0.251\boot$\boot.bat")

表示运行批处理 \\192.168.0.251\boot$\boot.bat
这样做,实际上有可能不够兼容,因为winxp sp2有可能提示该文件可能不安装是否运行,所以,我们不直接运行,用call,call是dos命令中的调用其它批处理命令,在这里我们的特殊用处是不出现xp的安全提示。(当然不出现安全提示,还可以通过修改注册表,或者将ip换成机器名的形式,但这样做最方便,ip地址直接访问也最稳定,我推荐用下面的方法。)

_RunDOS("call \\192.168.0.251\boot$\boot.bat")

2,运行批处理不显示控制台窗口(俗称黑框框)
这里我们已经解决了第二个问题。因为_rundos 这个自定义函数的源代码是

Func _RunDOS($sCommand)
Local $nResult = RunWait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)
Return SetError(@error, @extended, $nResult)
EndFunc ;==>_RunDOS

看不懂没关系,只要注意到其中 @SW_HIDE 这个显示标志,表示"隐藏窗口"即可,也就是在运行这个批处理的过程中隐藏了窗口。

3,考虑服务器关机的情况。(或者说是客户机开机网络连接延时判断)  
用中文来说,我们作一个选择:如果服务器没有关机,运行批处理,如果关机记录日志。

If Ping("192.168.0.251") Then
_RunDOS("call \\192.168.0.251\boot$\boot.bat")
Exit
EndIf
其中
if ... then

endif
是au3的条件选择语句,意思是
如果ping 192.168.0.251成功,则运行
_RunDOS("call \\192.168.0.251\boot$\boot.bat")
退出
exit 表示退出程序。

这里就实现了对服务器是否在线的判断(也可以是开机网络连接延时判断)。我们这样判断在实际中没有太大的意义,我们要实现的是当服务器关机时程序等待,等待到开机后,再运行机制批处理。所以我们接下来要用到循环语句。
while
wend
代码如下:
while 1
If Ping("192.168.0.251") Then
_RunDOS("call \\192.168.0.251\boot$\boot.bat")
Exit
EndIf
wend

其中while 后面的1表示一直循环。

程序的运行过程就是在while 1 和 wend之间的代码一直运行
里面的代码,如果服务器在线,运行批处理,运行完批处理exit(退出程序),如果服务器不在线呢?程序就继续循环,直到服务器在线为止。

到此,完整的代码就是:

#include <Process.au3>
while 1
If Ping("192.168.0.251") Then
_RunDOS("call \\192.168.0.251\boot$\boot.bat")
Exit
EndIf
wend


4,如果考虑这个程序给别的朋友用,那么我们势必要写个配置文件来实现通用。

这里我们学习配置文件的读取,详细函数用法就参考帮助文档,这里就不复制了,直接上代码。

首先我们对程序作一些改动,定义一些变量。方便我们学习更高级的程序语言,我们采取先定义再使用的方法定义变量。
#include <Process.au3>
dim $Serverip
dim $serverroute
$Serverip = iniread(@scriptdir & "\boot.ini","配置","服务器IP","192.168.0.251")
$serverroute = iniread(@scriptdir & "\boot.ini","配置","批处理路径","\\192.168.0.251\boot$\boot.bat")
while 1
If Ping($Serverip) Then
_RunDOS("call " & $serverroute)
Exit
EndIf
wend

在程序同目录,新建一个boot.ini作为配置文件,内容为
[配置]
服务器IP=192.168.0.251
批处理路径=\\192.168.0.251\boot$\boot.bat

对于新手来说,上面的代码复杂了一点,但是只要你花几秒钟认真理解,是非常简单的。

下面我们一一解释

#include <Process.au3>
;包含process.au3文件,用于在下面使用自定义函数_RunDOS

dim $Serverip
dim $serverroute

;因为要读取配置文件,所以定义上面两个变量,$serverip 表示服务器IP,$serverroute表示批处理路径。

$Serverip = iniread(@scriptdir & "\boot.ini","配置","服务器IP","192.168.0.251")
$serverroute = iniread(@scriptdir & "\boot.ini","配置","批处理路径","\\192.168.0.251\boot$\boot.bat")

; 读取配置文件,给$Serverip,$serverroute两个变量赋值。
iniread(@scriptdir & "\boot.ini","配置","服务器IP","192.168.0.251")
; 这句表示 读取程序所在目录的boot.ini文件,读取该文件的“配置”字段的“服务器IP”这个关键字后面的值。
最后的 "192.168.0.251" 表示默认值,如果读取失败就使用该值。

while 1
If Ping($Serverip) Then
_RunDOS("call " & $serverroute)
Exit
EndIf
wend

上面我们已经说过了。


如果该程序投入网吧使用的话,建议在开头加上。#NoTrayIcon,表示不显示系统托盘图标。



本节完,示例和源码与配置文件在附件中提供,供学习讨论。

请大家仔细理解(不懂可以反复看帮助,或者跟贴讨论。)


程序运行参数
au3运行程序时 "@SW_HIDE" 参数表示隐藏运行,将不出现被运行程序的窗口。

ping
用于判断网络是否连通

if then
endif
判断语句:判断条件如果成功做某事,如果不成功做另外的事。

while
wend
循环语句,用于循环执行某些命令,至到出现一些关键字,如exit,程序结束。

_rundos()
用户自定函数:用于运行批处理

iniread()
配置读取:用于读取配置文件中的值,使程序更具有通用性。

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛 https://bbs.txwb.com

关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩

本文来源:wglm 作者:thinking

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行