事实证明,当有任务需要我们用程序来解决,或者以实例出发是最好的学习程序设计的方法。在解决问题的过程中学习函数的用法、编程思想等激发起的兴趣又可以进一步让人去学习基础知识的冲动,基础知识(内功)的扎实,又可以进一步优化我们的程序让其效率更高,代码更优美,逻辑更清晰。如此循环,他日定成正果,跳出三界外,不在五行中。
所以,这一章,我们还是以实例开始,
我们这第一章第四节(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()
配置读取:用于读取配置文件中的值,使程序更具有通用性。