运维开发windows下的自动化脚本语言autoit
Posted 运维之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维开发windows下的自动化脚本语言autoit相关的知识,希望对你有一定的参考价值。
注:
- “运维数据集中”属于知识体系的“工具-运维开发-autoit3脚本语言”
- 本篇介绍一下autoit脚本语言的使用,主要作为经验的总结
- 语法的介绍有些摘自操作文档
一、背景:
运维自动化中的操作自动化,比如安装部署,应急操作,服务器切换等偏操作类的工作,归到最底层就是一个个脚本按既定的流程,通过代理(或无代理的SSH方式)远程调用执行。同时,为了提高使用效率提供流程编排,丰富操作可视化,再通常CMDB关联监控,流程审批等工具实现工具间的互联互通,形成管理上的闭环。
对于最底层的脚本,目前可供我们选择的有很多,比如常用的python,shell,bat。在实际实践中,windows操作系统下的运维操作的自动化比linux更麻烦一些。因为在linux下的日常运维操作的就是一些命令的组合,通过python或shell可以比较快的实现。windows则不同,我们的习惯是鼠标在前端工具上操作,这不是python等脚本语言所不擅长的,如果要用python等脚本实现,需要运维人员在思维进行转变,将前端的界面操作转换转化为后台可运行的脚本语言实现。另外,当遇到一些不支持二次开发的商业软件,上面的转换就会变得无解。比如:
- 每天需要在一个现有的C/S软件上进行开关操作,但这个软件工具又不提供任何接口;
- 要在几十台机器上给病毒软件打个补丁,但软件厂家只提供一个在软件菜单上点击按钮的方式来实现升级;
上面两种情况,有几个特点:
windows操作系统上的软件操作;
这个软件不提供调用接口或调用接口的成本高;
主要是通过鼠标在多个界面上来回切换,键盘输入的操作;
解决上面的问题是autoit脚本语言的强项,autoit脚本是一种在WINDOWS下模拟手工操作的脚本语言,可以作为需要在WINDWOS界上进行操作的自动化,比如:
运行 Windows 及 DOS 下的可执行文件
模拟键击动作(支持大多数的键盘布局)
模拟鼠标移动和点击动作。
对窗口进行移动、调整大小和其它操作。
直接与窗口的“控件“交互(设置/获取 文字、移动、关闭,等等)
配合剪贴板进行剪切/粘贴文本操作
另外,它还附有大量获取数据的宏
二、语言概况:
1、一些基本的语法:
语法有很多,具体可以到网上下载一个帮助文档,下面只摘常用的几点:
1)条件if … then ….else….endif
If $var > 10 Then
MsgBox(0, "示例", $var & " 果真大于 10!^_^")
Else
MsgBox(0, "示例", $var & " 居然小于 10!?-_-!")
EndIf
2)条件select
$var = 30
Select
Case $var > 1 AND $var <= 10
MsgBox(0, "示例", "$var 大于 1")
Case $var > 10 AND $var <= 20
MsgBox(0, "示例", "$var 大于 10")
Case $var > 20 AND $var <= 30
MsgBox(0, "示例", "$var 大于 20")
Case $var > 30 AND $var <= 40
MsgBox(0, "示例", "$var 大于 30")
Case $var > 40
MsgBox(0, "示例", "$var 大于 40")
EndSelect
3)FOR
For $i = 5 to 1 Step -1
MsgBox(0, "倒数", $i)
Next
MsgBox(0,"", "循环结束")
4)While...WEnd
While $i<3
MsgBox(0,"example",$i)
$i = $i + 1
WEnd
MsgBox(0,"", "循环结束")
5)Do...Until
Do
MsgBox(0, "目前变量 $i 的值是: ", $i)
$i = $i + 1
Until $i = 10
6) 函数
$val = 10
For $i = 1 To 10
$doubled = MyDouble($val)
MsgBox(0, "", $val & " 的两倍是 " & $doubled)
$val = $doubled
Next
Exit
Func MyDouble($value)
$value = $value * 2
Return $value
EndFunc
7) 注释
单行: ;
多行:
#comments-start
...
...
#comments-end
注:缩写代替:#cs 和 #ce。
8) 嵌入文件
#include
9)参数:
AutoIt3.exe myscript.au3 参数1 "这是一个字符串型参数"
$CmdLine[0] 等价于... 2
$CmdLine[1] 等价于... 参数1
$CmdLine[2] 等价于...这是一个字符串型参数
@ScriptName 等价于... myscript.au3
$CmdLineRaw,它保存着完整的未被拆分的命令行语句,等价于...myscript.au3 参数1 "这是一个字符串型参数"
2、常用的一些方法
1)SEND(对指定窗口发送键盘命令时会用到)
'^':表示告知 AutoIt 要发送一个 CONTROL 键击动作,因此语句 Send("^!a") 的意思是发送按键 "CTRL+ALT+a"。以下是一些常用的键盘按键:
Send 命令(无标志参数) |
键击结果 |
{!} |
! |
{#} |
# |
{+} |
+ |
{^} |
^ |
{{} |
{ |
{}} |
} |
{SPACE} |
空格 |
{ENTER} |
主键盘区的 回车键 |
{ALT} |
ALT |
{BACKSPACE} 或 {BS} |
退格 |
{DELETE} 或 {DEL} |
删除(DELETE) |
{UP} |
向上箭头 |
{DOWN} |
向下箭头 |
{LEFT} |
向左箭头 |
{RIGHT} |
向右箭头 |
{HOME} |
HOME |
{END} |
END |
{ESCAPE} 或 {ESC} |
ESC键 |
{INSERT} 或 {INS} |
INS(Insert) |
{PGUP} |
PageUp |
{PGDN} |
PageDown |
{F1} - {F12} |
功能键 |
{TAB} |
TAB |
{PRINTSCREEN} |
Print Screen key |
{LWIN} |
左徽标键 |
{RWIN} |
右徽标键 |
{NUMLOCK on} |
NUMLOCK (on/off/toggle)(开/关/切换) |
{CAPSLOCK off} |
CAPSLOCK (on/off/toggle)(开/关/切换) |
{SCROLLLOCK toggle} |
SCROLLLOCK (on/off/toggle)(开/关/切换) |
{CTRLBREAK} |
Ctrl+Break |
{PAUSE} |
PAUSE |
{NUMPAD0} - {NUMPAD9} |
数字键盘上的 数字键 |
{NUMPADMULT} |
数字键盘上的 乘号 |
{NUMPADADD} |
数字键盘上的 加号 |
{NUMPADSUB} |
数字键盘上的 减号 |
{NUMPADDIV} |
数字键盘上的 除号 |
{NUMPADDOT} |
数字键盘上的 点号 |
{NUMPADENTER} |
数字键盘上的 回车键 |
{APPSKEY} |
Windows 应用程序键 |
{LALT} |
左 ALT 键 |
{RALT} |
右 ALT 键 |
{LCTRL} |
左 CTRL 键 |
{RCTRL} |
右 CTRL 键 |
{LSHIFT} |
左 Shift 键 |
{RSHIFT} |
右 Shift 键 |
{SLEEP} |
系统休眠(SLEEP)键 |
{ALTDOWN} |
按住 ALT 键直到发送 {ALTUP} 为止 |
{SHIFTDOWN} |
按住 SHIFT 键直到发送 {SHIFTUP} 为止 |
{CTRLDOWN} |
按住 CTRL 键直到发送 {CTRLUP} 为止 |
{LWINDOWN} |
按住左徽标键直到发送 {LWINUP} 为止 |
{RWINDOWN} |
按住右徽标键直到发送 {RWINUP} 为止 |
{ASC nnnn} |
发送 ALT+nnnn 组合键 |
2、鼠标MouseClick
; 在当前位置执行一次双击
MouseClick("left")
MouseClick("left")
; 在位置 0,500 双击
MouseClick("left", 0, 500, 2)
3、RUN
运行外部程序。
Run ( "文件名" [, "工作目录" [, 标志]] )
Run("Notepad.exe", "", @SW_MAXIMIZE)
4、ProcessClose
结束某个进程。
ProcessClose ( "进程名" )
ProcessClose("notepad.exe")
; 返回记事本程序的 PID,若未发现该进程则返回值为 0。
$PID = ProcessExists("notepad.exe")
If $PID Then ProcessClose($PID)
ProcessExists
注:ProcessExists ( "进程名" )的用法:
进程名是指可执行文件的名称(无需给出完整路径),例如:"notepad.exe" 或 "winword.exe"
PID 是标识进程的唯一的数值。
为使 ProcessExists 函数能在 Windows NT 4.0 下工作,系统还需要一个 DLL 文件(PSAPI.DLL,已包含在 AutoIt 的安装目录下)。
每隔 250 毫秒左右进程将被检测一次。
示例
If ProcessExists("notepad.exe") Then
MsgBox(0, "示例", "记事本运行中。")
EndIf
5、WinWaitActive
暂停脚本的执行直至指定窗口被激活(成为可活动状态)为止。
WinWaitActive ( "窗口标题", ["窗口文本"], [超时时间] )
参数
窗口标题 |
目标窗口标题。 |
窗口文本 |
[可选参数] 目标窗口文本。 |
超时时间 |
[可选参数] 以秒为单位。 |
返回值
成功: |
返回值为1。 |
失败: |
返回值为0,说明已超时。 |
;等待窗口 "无标题" 出现并激活
WinWaitActive("无标题")
;同上,但指定了等待时间为 5 秒
WinWaitActive("无标题", "", 5)
6、MsgBox
通常用在调试当中
MsgBox(0, "标题", "内容")
上面几个命令用上,就能做一些简单的操作了,实际使用过程中,如果遇到一些操作可以查一下帮助文档。下面这些是我作了一些汇总的函数,可以找到了函数再去找帮助文档比较快:
7、其它函数
三、软件安装:
autoit3安装后会有以下几个子工具:
主要看这个工具:
AutoIt3.exe | AutoIt 的主程序,脚本文件 仅需 它即可得以解释运行! | ||
AU3Info.exe | AutoIt窗口信息工具,用来获取WINDOWS工具的窗口的信息,比如: |
||
AutoIt.chm | 帮助文件。 | ||
script | 编辑工具 |
AU3Info.exe这个工具很重要,它能获取:
窗口标题(Window titles)
窗口上的文本文字(Text)(包括可见部分和不可见部分)
窗口的大小和坐标位置
状态栏的内容
鼠标指针的坐标位置
鼠标指针所指象素的颜色值
鼠标经过的 控件(Control)的相关信息
通过上述信息可以进行对控件进行操作,比如下面这个界面的输入框:
四、示例:
近期用AUTOIT作了夜间清算、软件升级的自动化操作。
其中软件升级比较简单,需求是要对50台操作终端的商业软件(没有接口可调)进行软件升级,并进行补丁升级,中间还涉及配置一些可信文件夹以免被病毒软件删除补丁程序。
注:由于有些软件非标准的WINDOWS控件,所以只能通常坐标方式定位到控件,实际执行过程中最好通过控制句柄等唯一信息进行定位.。
DirCopy ( "WindowsLoader","D:\WindowsLoader")
sleep(10000)
Run("D:\WindowsLoader\tttt.exe")
WinWaitActive("C:\Windows\system32\cmd.exe")
MouseClick("left",373, 430, 1)
Send("{ENTER}")
sleep(5000)
sleep(5000)
Send("{ENTER}")
Send("{ENTER}")
sleep(5000)
Run("D:\WindowsLoader\bbbb.exe")
WinWaitActive("bbbbb")
MouseClick("left",767, 502, 1)
sleep(5000)
MouseClick("left",1086, 746, 1)
sleep(240000)
MouseClick("left",1156, 741, 1)
MouseClick("left",1077, 584, 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MouseClick("left",1814, 1060, 2)
WinWaitActive("状态 - Symantec Endpoint Protection")
Sleep(1000)
MouseClick("left",588, 417, 1)
MouseClick("left",1314, 517, 1)
WinWaitActive("例外")
MouseClick("left",724, 693, 1)
Sleep(1000)
MouseClick("left",735, 699, 1)
Sleep(1000)
MouseClick("left",846, 752, 1)
WinWaitActive("浏览文件夹")
Sleep(1000)
ControlSetText("浏览文件夹", "添加安全风险文件夹例外", "Edit1", "D:\WindowsLoader\" )
Sleep(3000)
MouseClick("left",989, 688, 1)
Sleep(1000)
MouseClick("left",1130, 728, 1)
Sleep(1000)
MouseClick("left",1397, 266, 1)
Sleep(1000)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RunWait('C:\Program Files (x86)\WinRAR\WinRAR.exe x -ad D:\WindowsLoader\aaaa.zip D:\WindowsLoader\')
Sleep(30000)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Run("D:\WindowsLoader\aaaa.exe")
Sleep(2000)
WinWaitActive("aaaa")
MouseClick("left",1101, 605, 1)
以上是关于运维开发windows下的自动化脚本语言autoit的主要内容,如果未能解决你的问题,请参考以下文章