2010-09-14 5 views
1

[Я отправил этот вопрос раньше в форуме 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)

ответ

1

Попробуйте найти решение: http://theadminblog.blogspot.com/2010/09/wpf-ui-automation-powershell-problem.html Автор столкнулся с той же проблемой и решил ее.

+0

Да, это именно оно. Я просто наткнулся на это сам (я опубликую полученный модуль как WASP 2 на wasp.codeplex.com позже) – Jaykul

+1

Спасибо за ответ - это мой пост в блоге :-) Я прошу прощения за не обновление этой темы. – 2010-10-26 13:38:09

Смежные вопросы