Overview
The newest versions of the AutoIt scripting language now come with a bonus for PowerShell users. A set of native PowerShell Cmdlets! This allows you to add the unique features of AutoIt – window manipulation and keystroke simulation – to your usual PowerShell scripts. As an additional bonus, the AutoIt PowerShell Cmdlets and Assemblies are digitally signed so they can be used with the more strict execution policies. The Cmdlets will also run natively with x86 and x64 versions of PowerShell!
This post will show how to use the AutoIt PowerShell Cmdlets to open notepad and type in some text in the edit control.
Installation
First download the latest version of AutoIt. You can run the full installer, or just download the zip file to get the required bits. Running the installer has the advantage of automatically registering the AutoIt Cmdlets. The files you need are as follows (get them from the zip file or the Program Files folder after installation):
- AutoItX.psd1
- AutoItX3.PowerShell.dll
- AutoItX3.Assembly.dll
- AutoItX3.dll
- AutoItX3_x64.dll
Usage
To use the Cmdlets open a PowerShell cmd prompt and enter:
Import-Module .\AutoItX.psd1
Now you can get a list of available AutoIt Cmdlets by doing Get-Command *AU3*:
PS> Get-Command *AU3*
Name Category Module
---- -------- ------
Invoke-AU3MouseWheel Cmdlet AutoItX
Move-AU3Mouse Cmdlet AutoItX
Invoke-AU3MouseClickDrag Cmdlet AutoItX
Get-AU3MouseCursor Cmdlet AutoItX
Invoke-AU3MouseUp Cmdlet AutoItX
Assert-AU3WinActive Cmdlet AutoItX
Assert-AU3WinExists Cmdlet AutoItX
Assert-AU3IsAdmin Cmdlet AutoItX
Invoke-AU3Shutdown Cmdlet AutoItX
Send-AU3ControlKey Cmdlet AutoItX
Invoke-AU3MouseDown Cmdlet AutoItX
Invoke-AU3MouseClick Cmdlet AutoItX
Invoke-AU3ControlTreeView Cmdlet AutoItX
Invoke-AU3ControlListView Cmdlet AutoItX
Invoke-AU3ControlCommand Cmdlet AutoItX
Invoke-AU3ControlClick Cmdlet AutoItX
Move-AU3Control Cmdlet AutoItX
Set-AU3ControlText Cmdlet AutoItX
Show-AU3Control Cmdlet AutoItX
Hide-AU3Control Cmdlet AutoItX
Get-AU3ControlText Cmdlet AutoItX
Get-AU3ControlFocus Cmdlet AutoItX
Set-AU3ControlFocus Cmdlet AutoItX
Disable-AU3Control Cmdlet AutoItX
Enable-AU3Control Cmdlet AutoItX
Get-AU3StatusbarText Cmdlet AutoItX
Invoke-AU3RunAsWait Cmdlet AutoItX
Invoke-AU3RunAs Cmdlet AutoItX
Invoke-AU3RunWait Cmdlet AutoItX
Invoke-AU3Run Cmdlet AutoItX
Set-AU3Clip Cmdlet AutoItX
Get-AU3Clip Cmdlet AutoItX
Set-AU3WinTrans Cmdlet AutoItX
Set-AU3WinTitle Cmdlet AutoItX
Set-AU3WinState Cmdlet AutoItX
Set-AU3WinOnTop Cmdlet AutoItX
Move-AU3Win Cmdlet AutoItX
Show-AU3WinMinimizeAllUndo Cmdlet AutoItX
Show-AU3WinMinimizeAll Cmdlet AutoItX
Get-AU3WinState Cmdlet AutoItX
Get-AU3WinProcess Cmdlet AutoItX
Get-AU3WinClassList Cmdlet AutoItX
Get-AU3WinCaretPos Cmdlet AutoItX
Get-AU3WinClientSize Cmdlet AutoItX
Get-AU3ControlPos Cmdlet AutoItX
Get-AU3ControlHandle Cmdlet AutoItX
Get-AU3MousePos Cmdlet AutoItX
Get-AU3WinPos Cmdlet AutoItX
Get-AU3WinHandle Cmdlet AutoItX
Get-AU3ErrorCode Cmdlet AutoItX
Initialize-AU3 Cmdlet AutoItX
Show-AU3WinActivate Cmdlet AutoItX
Close-AU3Win Cmdlet AutoItX
Wait-AU3WinClose Cmdlet AutoItX
Wait-AU3WinNotActive Cmdlet AutoItX
Set-AU3Option Cmdlet AutoItX
Send-AU3Key Cmdlet AutoItX
Wait-AU3Win Cmdlet AutoItX
Wait-AU3WinActive Cmdlet AutoItX
Get-AU3WinTitle Cmdlet AutoItX
Get-AU3WinText Cmdlet AutoItX
Example
I’ll show how to use the Cmdlets using a simple example that will open notepad.exe and modify the edit window by setting the text and simulating some keystrokes. First create a blank PowerShell script called notepad_example.ps1 in the same folder as the AutoItX components above and open it for editing.
Now we want to import the PowerShell module which is AutoItX.psd1. Enter the following in the script:
Import-Module .\AutoItX.psd1
We want to run notepad.exe:
Invoke-AU3Run -Program notepad.exe
After notepad opens we want to wait for the notepad “Untitled -Notepad” window to appear. You might need to change the title for non-English versions of Windows:
$notepadTitle = "Untitled - Notepad"
Wait-AU3Win -Title $notepadTitle
$winHandle = Get-AU3WinHandle -Title $notepadTitle
The Get-AU3WinHandle returns a native Win32 handle to the notepad window. We can use this handle in many other AutoIt functions and it uniquely identifies the window which is much more reliable than constantly using a windows title. If you have obtained a window handle using any other Win32 function you can use it with AutoIt.
After obtaining the handle to the notepad window we want to ensure that the window is active and then get a handle to the Edit Control. Using the AU3Info.exe tool that comes with AutoIt we can find that the name of the edit control in notepad is Edit1.
Show-AU3WinActivate -WinHandle $winHandle
$controlHandle = Get-AU3ControlHandle -WinHandle $winhandle -Control "Edit1"
Now that we have a handle to the edit control we can set text in two ways: Directly (Set-AU3Controltext) or with simulated keystrokes (Send-AU3ControlKey):
Set-AU3ControlText -ControlHandle $controlHandle -NewText "Hello! This is being controlled by AutoIt and PowerShell!" -WinHandle $winHandle
Send-AU3ControlKey -ControlHandle $controlHandle -Key "{ENTER}simulate key strokes - line 1" -WinHandle $winHandle
Now let’s see what the entire script looks like:
# Import the AutoIt PowerShell module
Import-Module .\AutoItX.psd1
# Run notepad.exe
Invoke-AU3Run -Program notepad.exe
# Wait for an untitled notepad window and get the handle
$notepadTitle = "Untitled - Notepad"
Wait-AU3Win -Title $notepadTitle
$winHandle = Get-AU3WinHandle -Title $notepadTitle
# Activate the window
Show-AU3WinActivate -WinHandle $winHandle
# Get the handle of the notepad text control for reliable operations
$controlHandle = Get-AU3ControlHandle -WinHandle $winhandle -Control "Edit1"
# Change the edit control
Set-AU3ControlText -ControlHandle $controlHandle -NewText "Hello! This is being controlled by AutoIt and PowerShell!" -WinHandle $winHandle
# Send some keystrokes to the edit control
Send-AU3ControlKey -ControlHandle $controlHandle -Key "{ENTER}simulate key strokes - line 1" -WinHandle $winHandle
Send-AU3ControlKey -ControlHandle $controlHandle -Key "{ENTER}simulate key strokes - line 2" -WinHandle $winHandle
Send-AU3ControlKey -ControlHandle $controlHandle -Key "{ENTER}{ENTER}" -WinHandle $winHandle
This is how the notepad window should look if everything is working correctly: