LoginSignup
16
18

More than 5 years have passed since last update.

PowerShellでVisualStudioの操作を自動化

Last updated at Posted at 2018-08-26

概要

VisualStudio(以下 VS)をPowerShellで操作する方法を紹介します。
色んな操作を自動化したりできるので便利です。
Jenkinsおじさんに使わせたりしても便利だと思います。

経緯

ディレクトリを再帰的に検索して発見したプロジェクトファイルをソリューションに加えていっていくのを自動化したかった↓
mov1.gif
↓これのgit
https://github.com/Y0KUDA/projects2sln

下準備

VSにアタッチする

アタッチする方法は二つあります。

  • 起動しているVSにアタッチする
  • 機動と同時にアタッチする

起動しているVSにアタッチする場合

PS > $VSDTE = [Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE")

起動と同時にアタッチする場合

PS > $VSDTE=New-Object -ComObject VisualStudio.DTE

これで変数$VSDTEを介してVSにアクセスできます。

起動と同時にアタッチする方法を使う場合、ウインドウが可視化されません。
可視化しなくても操作はできますが、可視化する場合は以下の操作をします。

PS > $VSDTE.MainWindow.Visible=$True

ステータスバーに文字を表示する

StatusBar.Textの値を書き換えます。

PS > $VSDTE.StatusBar.Text="HelloWorld"

こんな感じに表示が変更されれば成功です。正常にアタッチできています。
スクリーンショット (4).png
この方法を使えばステータスバーにSUSHIを流すことができます。
bar.gif
↓これのGit
https://github.com/Y0KUDA/VisualStudioSUSHI

ソリューションの操作

ソリューションを作成する

Solution.Create(string,string)関数を使います。
第一引数はファイルの保存先、第二引数はソリューションの名前です。

PS > $VSDTE.Solution.Create("C:\Users\yokuda\Desktop\PROJECTS","hello")

VSでソリューションを保存すると第一引数に指定した場所に保存されます。

ソリューションを保存する

Solution.SaveAs(string)関数を使います。
引数のパスにソリューションファイルが生成されます。

PS > $VSDTE.Solution.SaveAs("C:\Users\yokuda\Desktop\PROJECTS\hello.sln")

ソリューションを開く

Solution.Open(string)関数を使います。
引数のパスにあるソリューションファイルを開きます。

PS > $VSDTE.Solution.Open("C:\Users\yokuda\Desktop\PROJECTS\hello.sln")

ソリューションのビルド

Solution.SolutionBuild.Build(bool)関数を使います。

PS > $VSDTE.Solution.SolutionBuild.Build($False)

引数を$Trueにするとビルドが終了するまで関数がコントロールを保持します。
ビルドが終了するのを待ちたい場合に有効でしょう。

ソリューションフォルダの作成

Solution.AddSolutionFolder(string)関数を使います。
引数に指定した名前のフォルダが作成されます。
testという名前のフォルダを作成する例を紹介します。

PS > $VSDTE.Solution.AddSolutionFolder("test")

ソリューションフォルダの検索

NewFolder1というソリューションフォルダを検索する例を紹介します。

PS >  $VSDTE.Solution.Projects |
         ? FileName -eq "" |  # プロジェクトはファイル名が存在するがフォルダは存在しない。
         ? Name -eq "NewFolder" |  # NewFolder1で検索
         % Name # NewFolder1にアクセスできる。

ソリューションフォルダに対する操作

ソリューションフォルダに対してもプロジェクトの追加やフォルダの作成などの操作が可能です。
NewFolder1にNewFolder2を追加する例を紹介します。
Objectを介してアクセスする必要があるので少しクセがあります。

PS >  $VSDTE.Solution.Projects |
         ? FileName -eq "" |
         ? Name -eq "NewFolder1"|
         % {$_.Object.AddSolutionFolder("NewFolder2")}

プロジェクトの操作

プロジェクトをソリューションに作成する

Solution.AddFromTemplate(string,string,string)関数を使います。
第一引数はテンプレートファイルのパス、第二引数はプロジェクトを保存するパス、第三引数はプロジェクトの名前です。

PS > $VSDTE.Solution.AddFromTemplate("C:\Users\yokuda\Desktop\PROJECTS\Template1\ConsoleApplication1.vcxproj","C:\Users\yokuda\Desktop\PROJECTS\","hello")

既存プロジェクトの追加

Solution.AddFromFile(string)関数を使います。
引数のパスにあるプロジェクトファイルを開きます。

PS > $VSDTE.Solution.AddFromFile("C:\Users\yokuda\Desktop\PROJECTS\ConsoleApplication1\ConsoleApplication1.vcxproj")

各プロジェクトへのアクセス

Solution.Projectsを使います。すべてのプロジェクトが配列に格納されています。
特定のプロジェクトにアクセスするためには、検索する必要があります。
ここではプロジェクト名を使って特定する例を紹介します。

PS >  $VSDTE.Solution.Projects |
               ? Name -eq "ConsoleApp1" | # Name==ConsoleApp1でフィルタ
               % FullName #この行でConsoleApp1にアクセスできる

プロジェクトの保存

Solution.Projects[N].Save()関数を使います。
Nは目的のプロジェクトが格納された配列のインデックスを指定してください。
ConsoleApp1を保存する例を紹介します。

PS >  $VSDTE.Solution.Projects |
         ? Name -eq "ConsoleApp1" |
         % Save

プロジェクトの名前を変更する

Solution.Projects[N].Nameを変更します。
Nは目的のプロジェクトが格納された配列のインデックスを指定してください。
ConsoleApp1をApp1に変更する例を紹介します。

PS >  $VSDTE.Solution.Projects |
         ? Name -eq "ConsoleApp1" |
         % { $_.Name="App1"}

プロジェクトのビルド

Solution.SolutionBuild.BuildProject(string,string)関数を使います。
第一引数がビルドのコンフィグです。デフォルトでRelease/Debugが選べるやつです。
第二引数がプロジェクトのユニークネームです。これは$VSDTE.Solution.Projects[N].UniqueNameで取得することができます。
App1プロジェクトをビルドする例を紹介します。

PS >  $VSDTE.Solution.Projects |
         ? Name -eq "App1" |
         % { $VSDTE.Solution.SolutionBuild.BuildProject("Release",$_.UniqueName)}

プロジェクトにファイルを追加する

Solution.Projects[N].Object.AddFile(string)関数を利用します。
App1にC++ソースコードを追加する方法を紹介します。

PS >  $VSDTE.Solution.Projects |
         ? Name -eq "App1" |
         % {$_.Object.AddFile("C:\Users\yokuda\Desktop\PROJECTS\src.cpp")}

新しく生成する場合は、存在しないファイルへのパスを指定するとバグるのでファイルを作ってから実行するとうまくいきます。

PS >  $VSDTE.Solution.Projects |
         ? Name -eq "App1" |
         % {   echo "" >> C:\Users\yokuda\Desktop\PROJECTS\src.cpp # かんたんtouch
               $_.Object.AddFile("C:\Users\yokuda\Desktop\PROJECTS\src.cpp") }

終了する

PS >  $VSDTE.Quit()

参考

マイクロソフト公式ドキュメント
https://docs.microsoft.com/en-us/dotnet/api/envdte?view=visualstudiosdk-2017

16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18