Automation 以编程方式将条目添加到;“外部工具”;Visual Studio 2017的菜单

Automation 以编程方式将条目添加到;“外部工具”;Visual Studio 2017的菜单,automation,visual-studio-2017,envdte,Automation,Visual Studio 2017,Envdte,是否有人知道是否可以使用EnvDTE或任何其他方法向Visual Studio 2017的“外部工具”菜单添加条目?到目前为止,我发现的唯一一件事是添加一些注册表项,这些注册表项似乎对VS2017不起作用 回答我自己的问题 Axel Kemper在问题评论中的链接最终让我想到了这一点,它提供了一种非常简单的方法,可以将条目添加到外部工具列表中 基本上,您可以在IDE中生成所需的工具,并使用“工具|导入和导出设置”将相应的设置导出到xml文件。在我的情况下,我得到以下信息: <UserSet

是否有人知道是否可以使用EnvDTE或任何其他方法向Visual Studio 2017的“外部工具”菜单添加条目?到目前为止,我发现的唯一一件事是添加一些注册表项,这些注册表项似乎对VS2017不起作用

回答我自己的问题

Axel Kemper在问题评论中的链接最终让我想到了这一点,它提供了一种非常简单的方法,可以将条目添加到外部工具列表中

基本上,您可以在IDE中生成所需的工具,并使用“工具|导入和导出设置”将相应的设置导出到xml文件。在我的情况下,我得到以下信息:

<UserSettings>
  <ApplicationIdentity version="15.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">
      <ExternalTools>
        <UserCreatedTool>
          <Arguments>upload</Arguments>
          <CloseOnExit>true</CloseOnExit>
          <Command>c:\toolchain\make\make.exe</Command>
          <InitialDirectory>$(ProjectDir)</InitialDirectory>
          <IsGUIapp>false</IsGUIapp>
          <NameID>0</NameID>
          <Package>{00000000-0000-0000-0000-000000000000}</Package>
          <PromptForArguments>false</PromptForArguments>
          <SaveAllDocs>true</SaveAllDocs>
          <Title>neuteensy</Title>
          <Unicode>false</Unicode>
          <UseOutputWindow>true</UseOutputWindow>
          <UseTaskList>false</UseTaskList>
        </UserCreatedTool>
      </ExternalTools>
    </Category>
  </Category>
</UserSettings>

上传
真的
c:\toolchain\make\make.exe
$(ProjectDir)
假的
0
{00000000-0000-0000-0000-000000000000}
假的
真的
中性
假的
真的
假的
如有必要,可以通过手动或编程方式轻松调整文件中的设置


您可以将文件传递给用户进行手动导入,也可以使用链接答案中所示的envDTE自动导入文件。

作为替代方法,我编写了以下
cmd.exe
脚本来加载和访问Visual Studio 2017的专用注册表:


此版本需要管理员权限,只列出
外部工具
设置。可以添加对
reg.exe
的调用以创建新的工具设置条目。

这是否意味着VS2017正在使用..\14.0\External Tools中的键?我假设只有VS2015才能读取此注册表分支。我自己还没有掌握它,但您可以找到一个如何访问
用户设置存储的示例。对我来说似乎有点难以理解。Visual Studio 2017现在将其设置存储在私有注册表文件中,而不是存储在通用Windows注册表中。看看这个相关的(但不一定有用):这是有效的。如前所述导出工具设置,编辑XML以删除除要导入的选项以外的所有选项(因为默认情况下将导出工具列表中的所有条目)。然后使用DTE导入。这里的附加细节:很抱歉在旧线程上恢复,但是这允许在不破坏现有工具的情况下更新现有的外部工具吗?
@echo off
::
::  vsExtTools.cmd  -  Script to list external tools of Visual Studio 2017
::
::  Axel Kemper  29-Jul-2017  1st draft
::
setlocal

set VS_VERSION=15.0
set VS_APP_ROOT=%localappdata%\Microsoft
set DEBUG=1
set DEBUG=0

:: The RootSuffix for a normal VS installation will be blank. 
:: This is mostly used for the experimental instance 
:: cf  https://blog.agchapman.com/updating-registry-settings-for-visual-studio-2017/
set ROOT_SUFFIX=

call :findVSInstance %VS_APP_ROOT%\VisualStudio\%VS_VERSION% %ROOT_SUFFIX%
set REG_FILE=%VS_INSTANCE%\privateregistry.bin
if not exist "%REG_FILE%" goto no_reg

set HIVE_ROOT=HKLM\vsHive
call :trace Temporary registry hive %HIVE_ROOT%

::  administrative privileges are needed to load a hive
call :checkAdminRights
if [%IS_ADMIN%]==[0] goto xit

call :trace Loading registry hive from %REG_FILE%
reg.exe load %HIVE_ROOT% "%REG_FILE%"

call :trace %HIVE_ROOT%
reg.exe QUERY "%HIVE_ROOT%\Software\Microsoft\VisualStudio\%VS_HIVE%\External Tools" /s

:: Then you can use reg.exe to manipulate the hive

call :trace Unloading registry hive
reg.exe unload %HIVE_ROOT%

goto xit

:: ====================================================================
:findVSInstance
set VS_INSTANCE=
for /D %%D in (%1_*%2) do set VS_INSTANCE=%%D
for /D %%D in (%1_*%2) do set VS_HIVE=%%~nxD
call :trace VS Instance %VS_INSTANCE%
call :trace VS Hive %VS_HIVE%
goto :EOF

:: ====================================================================
:checkAdminRights
set IS_ADMIN=1
AT > NUL
IF %ERRORLEVEL% EQU 0 goto gotAdmin

call :grumble This script requires administrative privileges!
set IS_ADMIN=0
:gotAdmin
goto :EOF

:: ====================================================================
:grumble
echo.
echo %*
echo.
goto :EOF

:: ====================================================================
:no_reg
call :grumble Visual Studio %VS_VERSION% instance directory not found!
goto :xit

:: ====================================================================
:trace
if [%DEBUG%]==[1] (
echo %*
)
goto :EOF

:: ====================================================================
:xit
endlocal
pause