使用PowerShell将现有项目添加到解决方案文件夹

Sta*_*hev 9 powershell visual-studio envdte

我正在开发PowerShell脚本,以动态创建Visual Studio项目并将其文件夹和资产添加到解决方案中.我正在使用Visual Studio DTE.

我在文件系统上的目录结构如下:

C:\Dir1\Dir2\Stuff
|
+--Stuff                  <-- folder
|  |
|  `Stuff.csproj          <-- existing project, included in sln
|
+--Subfolder              <-- Subfolder in which I want to include my new csproj
|  +--Project1            <-- folder
|  |  |
|  |  `Project1.csproj    <-- existing project, included in sln
|  |
|  +--Project2            <-- folder
|  |  |
|  |  `Project2.csproj    <-- existing project, included in sln
|  |
|  `--Project3            <-- this, subs below and csproj are created from my script
|     |
|     `Project3.csproj
|
 `Stuff.sln
Run Code Online (Sandbox Code Playgroud)

我的脚本正确创建了Subfolder\Project3\Project3.csproj,我可以使用DTE将其添加到解决方案中而没有任何问题.

但是,我想在解决方案文件夹'Subfolder'中添加Project3 ,所以它看起来像这样(虚拟图像,红色箭头显示我想要Project3的位置):

图片

如何使用Powershell(以及可选的EnvDTE)实现此目的?任何示例代码将不胜感激.谢谢!

Dav*_*son 6

SolutionFolder接口具有"从文件添加"方法:

http://msdn.microsoft.com/en-us/library/envdte80.solutionfolder.addfromfile

Project AddFromFile(
    string FileName
)
Run Code Online (Sandbox Code Playgroud)

所以你只需要获得解决方案文件夹的句柄.我不知道您是通过DTE添加解决方案文件夹还是已经存在.

如果您使用Solution2.AddSolutionFolder添加它

http://msdn.microsoft.com/en-us/library/envdte80.solution2.addsolutionfolder%28v=vs.110%29.aspx

Project AddSolutionFolder(
    string Name
)
Run Code Online (Sandbox Code Playgroud)

它返回对solution文件夹的引用,您只需调用上面的方法即可.如果它已经存在,我认为你将不得不使用Solution2.FindProjectItem.

http://msdn.microsoft.com/en-us/library/2zszfd26%28v=vs.110%29.aspx

像下面这样的东西应该工作.我没有办法在那一刻尝试一下,所以可能需要调整.

Solution solution = System.Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.Solution")) as EnvDTE.Solution;
Solution2 sol2 = solution as Solution2;
sol2.Create(solutionPath, solutionName);

Project folder = sol2.AddSolutionFolder("Subfolder");

folder.AddFromFile(pathToProject);
Run Code Online (Sandbox Code Playgroud)