ソリューション内のすべてのプロジェクトをプログラムで一覧表示するにはどうすればよいですか?スクリプト、コマンドライン、またはAPI呼び出しを実行します。
次に、.slnファイルからプロジェクトの詳細を取得するPowerShellスクリプトを示します。
Get-Content 'Foo.sln' |
Select-String 'Project\(' |
ForEach-Object {
$projectParts = $_ -Split '[,=]' | ForEach-Object { $_.Trim('[ "{}]') };
New-Object PSObject -Property @{
Name = $projectParts[1];
File = $projectParts[2];
Guid = $projectParts[3]
}
}
var Content = File.ReadAllText(SlnPath);
Regex projReg = new Regex(
"Project\\(\"\\{[\\w-]*\\}\"\\) = \"([\\w _]*.*)\", \"(.*\\.(cs|vcx|vb)proj)\""
, RegexOptions.Compiled);
var matches = projReg.Matches(Content).Cast<Match>();
var Projects = matches.Select(x => x.Groups[2].Value).ToList();
for (int i = 0; i < Projects.Count; ++i)
{
if (!Path.IsPathRooted(Projects[i]))
Projects[i] = Path.Combine(Path.GetDirectoryName(SlnPath),
Projects[i]);
Projects[i] = Path.GetFullPath(Projects[i]);
}
編集:Kumar Vaibhavのコメントに従って、「。*」を含むように正規表現を修正しました
EnvDTE.Solution.Projectsオブジェクトを使用して、ソリューション内のプロジェクトにプログラムでアクセスできます。
ただし、問題の1つは、ソリューションにSolutionFolderがある場合、これらのフォルダー内のプロジェクトは上記のコレクションに表示されないことです。
どのようにソリューションフォルダーに関係なく すべてのプロジェクトを取得する のコードサンプルを含む記事を書きました
トリックは、正しいMsBuild.dllを選択することです。 VS2017では、実際には「C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\AMD64\Microsoft.Build.dll」です(参照で標準のMsbuild ddlを使用しないでください。これを参照してください)道)
c#:
var solutionFile =
SolutionFile.Parse(@"c:\NuGetApp1\NuGetApp1.sln");//your solution full path name
var projectsInSolution = solutionFile.ProjectsInOrder;
foreach(var project in projectsInSolution)
{
switch (project.ProjectType)
{
case SolutionProjectType.KnownToBeMSBuildFormat:
{
break;
}
case SolutionProjectType.SolutionFolder:
{
break;
}
}
}
パワーシェル:
Add-Type -Path (${env:ProgramFiles(x86)} + '\Microsoft Visual
Studio\2017\Professional\MSBuild\15.0\Bin\AMD64\Microsoft.Build.dll')
$slnPath = 'c:\NuGetApp1\NuGetApp1.sln'
$slnFile = [Microsoft.Build.Construction.SolutionFile]::Parse($slnPath)
$pjcts = $slnFile.ProjectsInOrder
foreach ($item in $pjcts)
{
switch($item.ProjectType)
{
'KnownToBeMSBuildFormat'{Write-Host Project : $item.ProjectName}
'SolutionFolder'{Write-Host Solution Folder : $item.ProjectName}
}
}
現在、VSで Package Manager Console を使用してその情報を取得できます。 PowerShellを使用するGet-Project
コマンド
Get-Project -All
* .slnファイルからリストを読み取るだけです。 「プロジェクト」-「EndProject」セクションがあります。
これが MSDNの記事です
ここには本当にエレガントなソリューションがあります: Visual Studioソリューションファイルの解析
John Leidegrenの答えは、内部Microsoft.Build.Construction.SolutionParser
クラス。
プログラムをVisual Studioアドインとして作成する場合、 EnvDTE
にアクセスして、現在開いているソリューション内のすべてのプロジェクトを見つけることができます。
Visual Studio 2013以降、Microsoft.Build.dllはSolutionFileオブジェクトにいくつかの便利な機能を提供します。
以下は、v14.0バージョンを使用して、すべてのプロジェクトの相対パスをソリューションに表示される順序でリストする例です。
Add-Type -Path (${env:ProgramFiles(x86)} + '\Reference Assemblies\Microsoft\MSBuild\v14.0\Microsoft.Build.dll')
$solutionFile = '<FULL PATH TO SOLUTION FILE>'
$solution = [Microsoft.Build.Construction.SolutionFile] $solutionFile
($solution.ProjectsInOrder | Where-Object {$_.ProjectType -eq 'KnownToBeMSBuildFormat'}).RelativePath
プロジェクトオブジェクトには、使用できる可能性のある他の多くのプロパティ(ProjectName、AbsolutePath、構成など)があります。上記の例では、ProjectTypeを使用してソリューションフォルダーを除外しました。
Windows以外のマシンでこれを行う必要がある場合は、次のBashコマンドを使用できます。
grep "Project(" NameOfYourSolution.sln | cut -d'"' -f4
これはおそらくすでに回答済みの質問であることはわかっていますが、slnファイルを読み取る私のアプローチを共有したいと思います。また、実行時にプロジェクトがテストプロジェクトかどうかを決定しています
function ReadSolutionFile($solutionName)
{
$startTime = (Get-Date).Millisecond
Write-Host "---------------Read Start---------------"
$solutionProjects = @()
dotnet sln "$solutionName.sln" list | ForEach-Object{
if($_ -Match ".csproj" )
{
#$projData = ($projectString -split '\\')
$proj = New-Object PSObject -Property @{
Project = [string]$_;
IsTestProject = If ([string]$_ -Match "test") {$True} Else {$False}
}
$solutionProjects += $proj
}
}
Write-Host "---------------Read finish---------------"
$solutionProjects
$finishTime = (Get-Date).Millisecond
Write-Host "Script run time: $($finishTime-$startTime) mil"
}
これがお役に立てば幸いです。