PowerShell でRPA（UI Automation PowerShell Extensions活用）

WindowsアプリケーションのGUIを、PowerShellの拡張モジュールであるUI Automation PowerShell Extensionsを使って自動操作する方法について紹介します。ただし、ここで紹介する方法では、ブラウザ上で動作するアプリケーションや、Javaアプリケーションの操作を自動化することは出来ませんので、ご了承願います。:bow_tone1:

## 将来性は無いけど個人で使うにはお手軽

GUIを自動操作する技術は、元々は、アプリケーションのテストを自動化する技術として開発されました。テストツールには、OSS(Open Source Software)として開発されているものも広く使われています。ブラウザを操作するテストツールとしてはSeleniumが有名です。一方、WindowsアプリケーションのGUIをテストする場合は、Windows .NET Frameworkに組み込まれているUI Automation機能をVisual Studioのような開発環境から使用するのが一般的です。
このUI Automationという機能を、PowerShellで使えるようにした、PowerShellの拡張モジュールであるUI Automation PowerShell Extensionsというものが存在します。
残念ながら2014年で開発を終了しているのでバグフィックスやエンハンスの可能性は無く、使い方に関する情報は極端に少ない状況なのですが、ちょっとした自動化向けには、UI Automationを直に使うよりは簡単な構文で使え、セットアップも簡単なので、すぐ使える手軽さがあります。
## PowerShellによるRPAが想定される場面
RPAツールは、世の中に数多く出回っていますが、個人で利用するにはライセンス費用が、高すぎるのが実情です。
RPAツールの中には、小規模事業者や開発者向けに、無料で使用できるCommunity版を公開しているツールもありますが、Community版を使うためには、ライセンス認証のためにインターネット接続が必要になっているのが通例だと思います。

* 個人で自動化をしたいので無料で使いたい。
（例）ちょっとした操作を自動化したいので、「会社でRPA導入」というところまでいかない。コマンドラインから実行して動くような手軽な自動化をやりたい。

* 使いたいときすぐ使えて作業が終わるまで専有したい。
（例）自分のPCにしかインストールしていないアプリケーションの操作を自動化したいとき。

* インターネット接続が許可されていない環境で使いたい。
（例）閉じたネットワーク環境でソフトウェア開発を行っているような場合で、複数の検査ツールを実行して、動作条件をテストケースに合わせて、手順やデータを間違えないように設定したいとき。

といった要望に、UI Automation PowerShell Extensionsなら応えてくれます。
GUIのテストに使えるものは、RPAに活用できるので、UI Automation PowerShell Extensionsを使えば、WindowsアプリケーションのGUIを自動操作できます。
スクリプトの作成には、Windwosに標準でインストールされている、PowerShell ISEというエディタが使えるので、開発環境のために新しく準備するソフトウェアは必要ありません。
また、UI Automation PowerShell Extensionsは、圧縮ファイルを解凍してローカルフォルダに格納するだけで使えるようになります。
## 簡単なスクリプト例
Windows10に標準でインストールされている、電卓のボタン[1]をクリックするスクリプトです。

```powershell:電卓のボタン1クリック.ps1
Import-Module C:\UIAutomation\UIAutomation.0.8.7B3.NET35\UIAutomation.dll
$wndw = Get-UiaWindow -Name '電卓'
$wndw | Get-UiaButton -AutomationId 'num1Button' | Invoke-UiaButtonClick
```

1行目は、UI Automation PowerShell Extensionsを使うためにImportしています。拡張モジュールの機能は、このようにImportすると使えるようになります。
2行目は、Nameが「電卓」というウィンドウを、操作対象ウィンドウとして検索します。3行目では、AutomationIdが「num1Button」というボタンを検索して、クリックしています。
NameとかAutomationIdさえ分かれば、スクリプトとしては簡単だと思いませんか？:heart_eyes:
UI Automation PowerShell Extensionsには、NameとかAutomationIdを教えてくれるツール、UIAutomationSpyが付属しているので、操作するオブジェクトを簡単に見つけることができます。UIAutomationSpyは、マウスの位置にあるオブジェクトを解析して、NameやAutomationIDを表示します。
## 入手方法とセットアップ
「CodePlex」サイトが閉鎖されてしまったようです。これに代わって再配布サイトが出来ていますので、再配布サイトからダウンロードが可能です。入手方法については、[こちら](https://masuo.doorblog.jp/archives/51807417.html)の記事を参考にしてください。（訂正 2022/12/24）
~~UI Automation PowerShell Extensionsは、以前は「CodePlex」にプロジェクトサイトがありましたが、最近は、ほとんどのオープンソースの管理がGitHubに移行したことを受けて、「CodePlex」はその役割を終え、各プロジェクトのリソースなどすべてがアーカイブされました。
UI Automation PowerShell Extensionsは、以下に示すURLでダウンロードできますが、アーカイブされたことでプログラムがどこにあるのか探すのが難しくなっています。~~:worried:
~~ここでは、ファイルの入手方法を説明します。~~
~~URLで示したページのdownload archiveボタンをクリックして圧縮ファイルをダウンロードします。~~
~~2014年に開発が終了した当時の.NET 3.5用の最新バージョンが0.8.7B3です。このバージョンを使います。ダウンロードしたファイルを解凍してできるフォルダのリリース４４にあるファイル、末尾が1e00になっているものがそうです。このファイルもzipファイルなので、ファイル名を変更します。~~
~~ファイル名を変更してできたzipファイルを解凍してできたフォルダを、ローカルフォルダに格納します。~~
## UIAutomationSpyの使い方
操作対象のオブジェクトのNameとかAutomationIdを教えてくれるツール、UIAutomationSpyの使い方を確認しておきましょう。操作対象アプリケーションには、「電卓」を使います。
UIAutomationSpyの[Start]ボタンをクリックすると、マウスの位置にあるオブジェクトの解析が始まり、オブジェクトの検索方法をテキストボックスに表示し始めます。
![window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128425/b0497748-1818-b78b-a2de-1ea3efdf0ad5.png)
電卓ウィンドウの縁より少し外側にマウスを移動して、電卓ウィンドウ全体がピンク色の線で囲まれるようにマウスの位置を調整すると、電卓ウィンドウを検索する方法が、Get-UiaWindowを使って、Classは「ApplicationFrameWindow」、Nameは「電卓」のように現れます。
![button1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128425/7ed2434a-60f2-5037-1606-7a94070bf15d.png)
また、ボタン[1]にマウスを移動して、ボタン[1]がピンク色の線で囲まれるようにマウスの位置を調整すると、ボタン[1]を検索する方法が、Get-UiaButtonを使って、AutomationIDは「num1Button」、Classは「Button」、Nameは「1」のように現れます。
## 欠点は情報量の少なさ
開発が終了していることもあり、使い方に関する情報は極端に少ない状況です。うまく動かないときに相談する方法が無いのが欠点です。:sob:
ダウンロードしたファイルを解凍してできるフォルダの[wiki]-[Render]の下に、各種コマンドレットの使い方を説明したHTMLファイルがあります。難点は、HTMLファイル毎にさらに個別のフォルダに分かれていることですが、説明が無いよりはましですね。
私は、個別フォルダの中のHTMLファイルを集めて1つのHTMLファイルにして利用しています。こうすると、コマンドレットの使い方を調べるときのストレスが軽減されます。:sweat_smile:
HTMLファイルでボタンの操作について知りたいときは「UiaButton」とかの文字列で検索する訳ですが、それだったらGet-Commandで使えそうなコマンドレットを表示してしまう方が、早道だったりします。以下の例は、PowerShell ISEのコンソールで、ボタンとコンボボックスの操作に使えそうなコマンドレットを表示したものです。
![get-command例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128425/d093067b-3a8f-df91-24f3-88b66a6571a3.png)
ただし、注意しなければいけないのは、Get-Commandで表示されるコマンドレットのすべてが有効という訳では無いということです。例えば、スピナーの値を設定する方法を見つけるのには苦労しました。
Get-Commandで検索すると、値設定に使えそうなコマンドレットとしてSet-UiaSpinnerRangeValueやSet-UiaSpinnerValueが表示しますが、このコマンドレットでは値を設定することができませんでした。
スピナーのオブジェクトを取得して、RangeValueプロパティに値を代入すればいいことは分かったのですが、スピナーに関する説明は、前述のHTMLファイルに無いんですよね。:tired_face:
以下の例は、「マウスのプロパティ」の「ホイール」タブにある垂直スクロールの設定で、1目盛りでスクロールする量を3に設定します。
![spinner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128425/abf65847-0daa-23ce-fac6-04baa863b7ee.png)

```powershell:スピナーの値設定.ps1
Import-Module C:\UIAutomation\UIAutomation.0.8.7B3.NET35\UIAutomation.dll
$wndw = Get-UiaWindow -Name 'マウスのプロパティ'
$spinner = $wndw | Get-UiaSpinner -Name 'ホイールの 1 目盛りでスクロールする量:'
$spinner.RangeValue = 3
```

## まとめ
UI Automation PowerShell Extensionsを活用すると、身近にあるソフトウェアだけでGUI操作の自動化を実現できます。
会社で導入するとなると、『ソフトウェアを統一しなきゃ』とか『製品の継続性に問題ないか』とか、考える必要がありますから、あくまでも個人レベルで業務の効率化を図るときの選択肢とはなりますが、日々のGUI操作でストレスを感じているものがあるなら、自分専用にちょっと自動化して、楽しんでみてはいかがでしょうか。
また、同様の理由から、中学校や高校のクラブ活動の教材としても向いているのではないかと思います。
## 関連ブログ・動画
:page_facing_up:ブログ：[PowerShellで画面操作自動化](https://masuo.doorblog.jp/archives/cat_50054521.html)
:movie_camera:動画：[UI Automation PowerShell Extensions 活用講座](https://www.udemy.com/course/uiautomationpse/?referralCode=9CC369A94400B7415315)