「PowerShell UI Automation 操作」といったキーワード検索からのアクセスがありました。
PowerShellで何かしらのアプリケーションを操作したい方だと思います。
対象となるアプリケーションが何なのか分かりませんが、一例として、「電卓」を操作するコードを書いてみました。
Add-Type -AssemblyName "UIAutomationClient" Add-Type -AssemblyName "UIAutomationTypes" $uiAuto = [Windows.Automation.AutomationElement] $tree = [Windows.Automation.TreeScope] $pcnd = [Windows.Automation.PropertyCondition] $acnd = [Windows.Automation.AndCondition] $iptn = [Windows.Automation.InvokePattern]::Pattern $root = $uiAuto::RootElement #電卓起動 start "calc" $elmApp = $null $cndAppName = New-Object $pcnd($uiAuto::NameProperty, "電卓") $cndAppClassName = New-Object $pcnd($uiAuto::ClassNameProperty, "ApplicationFrameWindow") $cndAppAnd = New-Object $acnd($cndAppName, $cndAppClassName) do{ Start-Sleep -m 200 $elmApp = $root.FindFirst($tree::Children, $cndAppAnd) }while($elmApp -eq $null) #ナビゲーションを開く $elmNav = $null $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "TogglePaneButton") $cndNavAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "PaneRoot") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) do{ $ivkBtn.Invoke() Start-Sleep -m 200 $elmNav = $elmApp.FindFirst($tree::Subtree, $cndNavAid) }while($elmNav -eq $null) #ナビゲーション項目列挙 $cndItmClassName = New-Object $pcnd($uiAuto::ClassNameProperty, "ListViewItem") foreach($itm in $elmNav.FindAll($tree::Subtree, $cndItmClassName)){ $itm.Current.Name } #[標準]押下 $cndItmAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "Standard") $elmItm = $elmNav.FindFirst($tree::Subtree, $cndItmAid) $ivkItm = $elmItm.GetCurrentPattern($iptn) $ivkItm.Invoke() #[1-9]ボタン押下 for($i=1; $i -le 9; $i++){ $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num${i}Button") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) $ivkBtn.Invoke() Start-Sleep -m 200 #動作確認しやすいようにSleep } #[-]ボタン押下 $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "minusButton") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) $ivkBtn.Invoke() #適当に引き算 $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num1Button") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) $ivkBtn.Invoke() $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num0Button") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) $ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke() $ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke() #[=]ボタン押下 $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "equalButton") $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid) $ivkBtn = $elmBtn.GetCurrentPattern($iptn) $ivkBtn.Invoke()
大まかには上記のようなコードでアプリケーションを操作できますが、古いWin32アプリケーションの場合は下記サイトのような問題もあるようです。
UI Automationに限らず、外部のアプリケーション操作は思った以上に大変な処理になりますので、場合によっては運用側で対応することをお薦めします。
この記事へのコメントはありません。