[Я отправил этот вопрос раньше в форуме PowerShell Technet, но без ответа]PowerShell UIAutomation сценарий не возвращает ожидаемый результат
Я пытаюсь изменить Windows XP настройки быстрого запуска (включить/выключить его с помощью PowerShell) , Существующие решения VBScript полагаются либо на Registry, либо на SendKeys, поэтому я подумал, что это возможно в PowerShell через UIAutomation. Моя первая попытка состояла в том, чтобы получить ссылку на элемент AutomationElement, который представляет флажок, который необходимо изменить (панель управления -> панель задач и меню «Пуск» -> вкладка «Панель задач» -> «Показать быстрый запуск»). Вот сценарий:
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationClient")
[void][System.Reflection.Assembly]::LoadWithPartialName("UIAutomationTypes")
$root = [Windows.Automation.AutomationElement]::RootElement
$condition1 = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::NameProperty, 'Taskbar and Start Menu Properties')
$properties = $root.FindFirst([Windows.Automation.TreeScope]::Descendants, $condition1)
$condition2 = New-Object Windows.Automation.PropertyCondition([Windows.Automation.AutomationElement]::NameProperty, 'Show Quick Launch')
$checkboxes = $properties.FindAll([Windows.Automation.TreeScope]::Descendants, $condition2)
foreach($checkbox in $checkboxes)
{
$checkbox.Current.Name
$checkbox.Current.ControlType.ProgrammaticName
}
Сценарии не без ошибок, но он возвращает неожиданные результаты:
Показать Быстрый запуск
ControlType.Pane
Вместо ControlType.CheckBox скрипт видит AutomationElement как ControlType.Pane. Эквивалентный (по крайней мере я так думаю) приложение C# консоль возвращает ожидаемые результаты:
using System;
using System.Windows.Automation;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
AutomationElement root = AutomationElement.RootElement;
AutomationElement properties = root.FindFirst(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.NameProperty,
"Taskbar and Start Menu Properties"));
AutomationElementCollection checkboxes = properties.FindAll(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.NameProperty,
"Show Quick Launch"));
foreach (AutomationElement checkbox in checkboxes)
{
Console.WriteLine(checkbox.Current.Name);
Console.WriteLine(checkbox.Current.ControlType.ProgrammaticName);
}
}
}
}
Показать Быстрый запуск
ControlType.CheckBox
Что я делаю неправильно? Скрипт PowerShell выполняется из ISE (поэтому V2), и сценарий и программа C# предполагают, что апплет уже открыт/видим. (XP SP3)
Да, это именно оно. Я просто наткнулся на это сам (я опубликую полученный модуль как WASP 2 на wasp.codeplex.com позже) – Jaykul
Спасибо за ответ - это мой пост в блоге :-) Я прошу прощения за не обновление этой темы. – 2010-10-26 13:38:09