Интеграция PowerShell с Visual Studio 2010
Многим очень часто приходится во время разработки приложений пользоватся оболочкой 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 Украина | Украинское подразделение компании Microsoft. |