AIOps 一场颠覆传统运维的盛筵
2985
2022-10-03
【运维开发】windows下的自动化脚本语言autoit
注:
- “运维数据集中”属于知识体系的“工具-运维开发-autoit3脚本语言”
- 本篇介绍一下autoit脚本语言的使用,主要作为经验的总结
- 语法的介绍有些摘自操作文档
一、背景:
运维自动化中的操作自动化,比如安装部署,应急操作,服务器切换等偏操作类的工作,归到最底层就是一个个脚本按既定的流程,通过代理(或无代理的SSH方式)远程调用执行。同时,为了提高使用效率提供流程编排,丰富操作可视化,再通常CMDB关联监控,流程审批等工具实现工具间的互联互通,形成管理上的闭环。
对于最底层的脚本,目前可供我们选择的有很多,比如常用的python,shell,bat。在实际实践中,windows操作系统下的运维操作的自动化比linux更麻烦一些。因为在linux下的日常运维操作的就是一些命令的组合,通过python或shell可以比较快的实现。windows则不同,我们的习惯是鼠标在前端工具上操作,这不是python等脚本语言所不擅长的,如果要用python等脚本实现,需要运维人员在思维进行转变,将前端的界面操作转换转化为后台可运行的脚本语言实现。另外,当遇到一些不支持二次开发的商业软件,上面的转换就会变得无解。比如:
- 每天需要在一个现有的C/S软件上进行开关操作,但这个软件工具又不提供任何接口;
上面两种情况,有几个特点:
windows操作系统上的软件操作;这个软件不提供调用接口或调用接口的成本高;主要是通过鼠标在多个界面上来回切换,键盘输入的操作;
解决上面的问题是autoit脚本语言的强项,autoit脚本是一种在WINDOWS下模拟手工操作的脚本语言,可以作为需要在WINDWOS界上进行操作的自动化,比如:
二、语言概况:
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)
发表评论
暂时没有评论,来抢沙发吧~