Интеграция PowerShell с Visual Studio 2010

воскресенье, 23 мая 2010, Alexander Honcharuk

Многим очень часто приходится во время разработки приложений пользоватся оболочкой PowerShell.
Для того, что б не переключатся между окнами Visual Studio и какой-то оболочки PowerShell  было разработано плагин к студии PowerConsole.

Интеграция PowerShell

PowerConsole приносит богатую функциональность PowerShell в VS. Вы можете получить доступ к файловой системе, реестре, и многие другие поставщиками PowerShell, не выходя из VS. Вы также можете запустить командлеты PowerShell или запустить внешние программы.

Использование DTE 

PowerConsole предоставляет объект автоматизации DTE, для контакта с ним надо использовать переменную $dte. Вы можете объединить мощь PowerShell и автоматизированную систему Visual Studio для изучения свойств DTE в интерактивном режиме или написать простые скрипты для автоматизации повседневных задач в VS.

PS> # Example 1: Open *.cs files under current dir tree in VS
PS>
PS> Get-ChildItem . -Recurse -Include *.cs | %{ $dte.ItemOperations.OpenFile($_) }
 
PS> # Example 2: Invoke NewProject dialog
PS> $dte.ExecuteCommand("File.NewProject")
 
PS> # Example 3: Add 10 class files to current project (with a C#/VB project active)
PS> 1..10 | %{ $dte.ItemOperations.AddNewItem("Code\Class") }
 
PS> # Example 4: Close all opened document windows
PS> $dte.Documents | %{ $_.Close() }
VS Service

PowerConsole не останавливается на  интеграции c DTE. Для дополнительных сценариев, вы можете напрямую обращаться к сервисов VC. Две  вспомогательные функции PowerShell предоставляются исключительно для вашего удобства: Get-VSService и Get-Interface:

PS> # Example 1: Get the user’s VS dir through IVsShell.GetProperty
PS>
PS> $sh = Get-VSService ([Microsoft.VisualStudio.Shell.Interop.SVsShell]) ([Microsoft.VisualStudio.Shell.Interop.IVsShell])
PS> $sh.GetProperty([Microsoft.VisualStudio.Shell.Interop.__VSSPROPID2]::VSSPROPID_VisualStudioDir)
0
C:\Users\******\Documents\Visual Studio 2010
 
PS> # Example 2: Display a message box through IVsUIShell.ShowMessageBox
PS>
PS> function Show-VSMessage($msg)
>>  {
>>    $shui = Get-VSService `
>>     ([Microsoft.VisualStudio.Shell.Interop.SVsUIShell]) `
>>     ([Microsoft.VisualStudio.Shell.Interop.IVsUIShell])
>> 
>>    [void]$shui.ShowMessageBox(0, [System.Guid]::Empty,
>>     "", $msg, "", 0,
>>     [Microsoft.VisualStudio.Shell.Interop.OLEMSGBUTTON]::OLEMSGBUTTON_OK,
>>     [Microsoft.VisualStudio.Shell.Interop.OLEMSGDEFBUTTON]::OLEMSGDEFBUTTON_FIRST,
>>     [Microsoft.VisualStudio.Shell.Interop.OLEMSGICON]::OLEMSGICON_INFO, 0)
>>  }
PS>
PS> Show-VSMessage "Hello!"
 
 
PS> # Example 3: Consume DTE automation events
PS>
PS> $solutionEvents = Get-Interface $dte.Events.SolutionEvents ([EnvDTE._dispSolutionEvents_Event])
PS> $onOpen = [EnvDTE._dispSolutionEvents_OpenedEventHandler]{ Write-Host "Solution Opened!" }
PS> $solutionEvents.add_Opened($onOpen)
PS>
PS> # To unsubscribe:
PS> # $solutionEvents.remove_Opened($onOpen)

VS MEF Host

Начиная с Visual Studio 2010, много компонентов VS будут исполнены к комплексному использованию MEF. К счастью, VS MEF host регулярный сервис VS. PowerConsole позволяет запрашивать и взаимодействовать с любыми компонентами VS MEF компонентами. Еще одна функция PowerShell вспомогательно предоставлена для вашего удобства: Get-VSComponentModel.

PS> # Example 1: list all registered VS editor content types
PS>
PS> $cm = Get-VSComponentModel
PS> $reg = $cm.GetService([Microsoft.VisualStudio.Utilities.IContentTypeRegistryService])
PS> $reg.ContentTypes
 
TypeName                   DisplayName                BaseTypes               
--------                   -----------                ---------               
UNKNOWN                    UNKNOWN                    {}                      
intellisense               intellisense               {text}                  
text                       text                       {any}                   
C/C++                      C/C++                      {code}                  
CSharp                     CSharp                     {code}                  
CSS                        CSS                        {code}                  
...
 
PS> # Example 2: list all PowerConsole hosts
PS>
PS> $cm = Get-VSComponentModel
PS> $p = $cm.GetService([Microsoft.VisualStudio.PowerConsole.IPowerConsoleWindow])
PS> $p.Hosts
Microsoft.VisualStudio.PowerConsole.Host.IronPython
Microsoft.VisualStudio.PowerConsole.Host.IronRuby
Microsoft.VisualStudio.PowerConsole.Host.PowerShell

Расширяемость: Создайте свою собственную консоль

Если вы предпочитаете другой язык сценариев, вы можете расширить PowerConsole своими хостами команды. Все, что вам нужно для этого, так это сделать для реализации и экспорта вашей команды принимающей MEF компонент. Подробности вы можете взять из PowerConsole расширение каталога для интерфейса DLL/XML файла. Как доказательство концепции, еще одно расширение предоставлено IronPython / IronRuby консоли (поиск PowerConsole в галерее VS). Вы можете сделать то же самое в IronPython консоли, например:

PS> # Close all opened documents
PS> for doc in dte.Documents: doc.Close()
...
PS>

FAQ

Q: Есть ли в PowerConsole поддержка профилей пользователей, так что я могу сохранять переменные и функции и/или делать некоторые пользовательские сценарии загрузки?
A: Да, файл профиля пользователя - PowerShell, на который указывает переменная "$ PowerConsoleUserProfile".

Q: Я хочу изменить политики выполнения, с тем, что я могу запускать PowerShell скрипты PowerConsole, однако я получаю NotImlementedException при выполнении Set-ExecutionPolicy.
A: Передайте параметр "-Force" для Set-ExecutionPolicy, чтобы избежать подтверждения. Подтверждение поддержки NotImplemented.

Компании из статьи


Microsoft Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии