UI Automation PowerShell Extensionsを使ってみる

単票入力画面で入力効率アップのための工夫が一切無く、ほぼ同じ内容を何度も入力するという非人間的な作業に追われている事務担当者というのは、私以外にも結構居るかと思う。清く正しいエンジニア兼業事務担当者としては、ここは自動化すべきだろう。というわけで、PowerShellとUI Automation PowerShell Extensionsを使って作業の自動化を試みるよ。

UI Automation PowerShell ExtensionsはVisual Studioで開発されたアプリケーション画面のテストを自動化するために提供されているMicrosoft UI AutomationをPowerShellから呼び出せるようにしたものです。

UI Automation PowerShell Extensionsには残念な制約があって、Powershell Version 2.0でないと動きません。もしより高いバージョンのPowershellが既にインストールされている場合は”powershell -version 2″とコマンドライン引数を指定して、低いバージョンで起動する必要があります。また動作には管理者権限が必要です。管理者権限を持つユーザーでログインするのは当然として、UACを有効にしている場合は「管理者として実行」を選択する必要があります。

まずはUI Automation PowerShell ExtensionsからUIAutomation.x.x.xxx.NET35.zipをダウンロードします。ダウンロードしたZIPファイルに含まれているファイルを適当なフォルダに解凍します。ここでは「C:\Program Files\WindowsPowerShell\Modules」に「UIAutomation」というフォルダを作ってそこに解凍することにします。

とりあえずコマンドプロンプトからメモ帳を起動して実験してみましょう。

PS C:\Windows\system32> Import-Module "C:\Program Files\WindowsPowerShell\Modules\UIAutomation\UIAutomation.dll"
PS C:\Windows\system32> notepad
PS C:\Windows\system32> $window = Get-UiaWindow -Name '無題 - メモ帳'
PS C:\Windows\system32> $window.Keyboard.TypeText("Hello UI Automation")

メモ帳を起動して適当な文字列を入力することが出来ました。
notepad-sample

実際にScriptを作るにはUIAutomationSpy.exeと言うプログラムが付属しています。これを起動して一連の操作を行うと、その操作をScriptに保存する事が出来ます。
UIAutomation
UIAutomationSpy.exeを起動してStartボタンをクリックした後、Scriptにしたい一連の操作を実施し、Stopボタンをクリックします。Scriptタブに移動すると先ほどの操作を再現するためのScriptが生成されています。これをテキストエディタに張り付けて、Powershell Scriptとして保存します・・・が、この自動生成されるScriptはかなり汚いので実際に利用の際には大幅に修正する事になります。例えば先ほどのメモ帳に入力するサンプルも自動生成したScriptだとこうなります。

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'H'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hell'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello '

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello U'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello UI A'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello UI Au'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello UI Automati'

Get-UiaWindow -Class 'Notepad' -Name '無題 - メモ帳' | `
Get-UiaDocument -AutomationId '15' -Class 'Edit' -Name 'Hello UI Automation'

・・・(´・ω・`)
「AutomationId」とかClassを調べるためのツールと割り切った方が良さそうですね。

Windows Server 2012R2にSharePoint 2013をインストールすると「.NET Framework 4.5がインストールされていない」とエラーになる

Windows Server 2012R2にSharePoint 2013 Foundationをインストールしようとすると、.NET Framework 4.5がインストール済みにもかかわらず、.NET Framework 4.5がインストールされていない旨のメッセージが表示され、インストールを継続できない。これはWindows Updateで適用された.NET Framework 4.6等より新しいバージョンの.NET Frameworkがインストールされている場合に、正常に環境を認識できないためにおこる。
この現象はSharePointに限らず、.NET Framework 4.5を使用するソフトウェアのインストールで広く発生するらしい。
解決のためには「コントロールパネル→プログラムと機能→インストールされた更新プログラム」から、NET Framewrok 4.6に相当するKB3045563、4.5.2に相当するKB2901907、4.5.1に相当するKB2859818をアンインストールする。
アンインストールした後にSharePoint 2013 Foundationのインストールを行い、その後にあらためてWindows Updateの適用を行い.NET Framework 4.6のインストールを行えばよい。
参考:
SharePoint 2013 Setup error if the .NET Framework 4.6 is installed
.NET Framework 4.6 がインストールされた環境でWindows SDK for Windows 7 and .NET Framework 4 の Visual C++ Compilers がインストールできない

ASP.NETでPage.Titleを設定しても反映されない

ASP.NETでPage.Titleを設定しても反映されないので暫く悩んでいた。原因は、自動生成されるASPXファイルの先頭に記述されているページディレクティブで空白が指定されているためだった。

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="CitySearchDetail.aspx.cs" Inherits="WeatherArchiveWeb.CitySearchDetail" %>

ASPXファイルの先頭に<%@で始まる一行があるが、これがページディレクティブによるパラメータの設定。ここでTitle=""と指定されているので、コード中でPage.Titleを変更しても常に上書きされてしまう。