运维开发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的主要内容,如果未能解决你的问题,请参考以下文章

Linux运维人员需要掌握一门编程语言吗?

python是啥语言,主要应用在哪些开发?

selenium借助AutoIt识别上传(下载)详解

从传统运维到AIOps的必经之路

自动化运维脚本语言之expect实践学习

运维工程师需要掌握啥技能?