PowerShell script to auto-add Visual Studio "External Tools..." menu options? PowerShell script to auto-add Visual Studio "External Tools..." menu options? powershell powershell

PowerShell script to auto-add Visual Studio "External Tools..." menu options?


This is possible.

In the NuGet package's init.ps1 file, which has access to the DTE object, a new tool can be imported from a dynamically created file containing User Settings configuration that's then deleted after the user settings are imported.

Here's an example of a command to do imports. The example launches Powershell, executing a script in the root directory of a project. Note that I've used VS v9.0 for greatest backwards-compatibility, but it'd be possible to just export the existing tools menu configuration in v15.0 (or newer), and just replace the content in the file below accordingly.

init.ps1 file content

# NuGet Package installation script. Run # first time NuGet package installed to solution. param($installPath, $toolsPath, $package, $project)# Determine fully qualified path to a temp file$fileName = [System.IO.Path]::GetTempPath() + [System.Guid]::NewGuid().ToString() + ".vssettings"; # Create User Settings file:'<UserSettings>    <ApplicationIdentity version="9.0"/>    <ToolsOptions/>    <Category name="Environment_Group" RegisteredName="Environment_Group">        <Category name="Environment_ExternalTools" Category="{E8FAE9E8-FBA2-4474-B134-AB0FFCFB291D}" Package="{DA9FB551-C724-11d0-AE1F-00A0C90FFFC3}" RegisteredName="Environment_ExternalTools" PackageName="Visual Studio Environment Package">            <PropertyValue name="Launch Powershell.Command">powershell.exe</PropertyValue>            <PropertyValue name="Launch Powershell.Arguments">"& ''$(ProjectDir)\Myscript.ps1''"</PropertyValue>            <PropertyValue name="Launch Powershell.InitialDirectory">"$(ProjectDir)"</PropertyValue>            <PropertyValue name="Launch Powershell.SourceKeyName"/>            <PropertyValue name="Launch Powershell.UseOutputWindow">true</PropertyValue>            <PropertyValue name="Launch Powershell.PromptForArguments">false</PropertyValue>            <PropertyValue name="Launch Powershell.CloseOnExit">true</PropertyValue>            <PropertyValue name="Launch Powershell.IsGUIapp">false</PropertyValue>            <PropertyValue name="Launch Powershell.SaveAllDocs">true</PropertyValue>            <PropertyValue name="Launch Powershell.UseTaskList">false</PropertyValue>            <PropertyValue name="Launch Powershell.Unicode">false</PropertyValue>            <PropertyValue name="Launch Powershell.Package">{00000000-0000-0000-0000-000000000000}</PropertyValue>            <PropertyValue name="Launch Powershell.NameID">0</PropertyValue>            <PropertyValue name="ToolNames">Launch Powershell</PropertyValue>        </Category>    </Category></UserSettings>' >> $fileName# Perform the import of the custom tool$project.DTE.ExecuteCommand("Tools.ImportandExportSettings", "/import:""$fileName""");"--Remove file"Remove-Item -path $fileName

MyProject.nuspec (partial) content

In the .nuspec file, ensure that the init.ps1 file is included. In the case below, the source for the init.ps1 is in a Visual Studio project named 'MyProject' in the 'Scripts' folder.

<?xml version="1.0" encoding="utf-8"?><package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">    <metadata>      ...    </metadata>    <files>        ...        <!-- NuGet Package installation script. Run first time NuGet package installed to solution. -->        <file src="Scripts\init.ps1" target="tools\init.ps1" />    </files></package>


I am looking for same thing and so far it looks like there is no way how to interact with IDE from PowerShell. But I found this package http://www.nuget.org/packages/StudioShell.Provider/ and at the first sight it allows you to do advanced stuff which you can do only with plugins and extensions. But in my opinion it is little bit overkill for this problem.