Get list of .csproj
in directory and subdirectories of D:reposMTest
[1] PS D:reposMTest> ls -r -filter "*.csproj" | select Directory, Name
Sample output
Directory Name
--------- ----
D:reposMTestM.Common M.Common.csproj
D:reposMTestM.Mocks M.Mocks.csproj
D:reposMTestM.StateMachines M.StateMachines.csproj
Get list of files containing line(s) that match <ProjectReferences*Include="([^"]+)"
in directory and subdirectory
[2] PS D:reposMTest> ls | sls '<ProjectReferences*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}}
Sample output
Project DirectDeps
------- ----------
dirs.proj D:reposMTestM.Common
dirs.proj D:reposMTestM.Mocks.csproj
dirs.proj D:reposMTestM.StateMachines.csproj
M.Common.csproj D:reposSCommonCommon.csproj
M.Common.csproj D:reposQContractsContracts.csproj
M.Mocks.csproj D:reposSControllerController.csproj
M.StateMachines.csproj D:reposMCommonCommon.csproj
M.StateMachines.csproj D:reposTAuthAuth.csproj
Questions
Q1: How can I feed the output of [1] to [2] to limit [2]’s search to .csproj
files (i.e. exclude dirs.proj
) to get the following output
Project DirectDeps
------- ----------
M.Common.csproj D:reposSCommonCommon.csproj
M.Common.csproj D:reposQContractsContracts.csproj
M.Mocks.csproj D:reposSControllerController.csproj
M.StateMachines.csproj D:reposMCommonCommon.csproj
M.StateMachines.csproj D:reposTAuthAuth.csproj
Q2: And then how can I take that and make it group by Project/Filename? To get the following output (or similar)
M.Common.csproj, D:reposSCommonCommon.csproj, D:reposQContractsContracts.csproj
M.Mocks.csproj, D:reposSControllerController.csproj
M.StateMachines.csproj, D:reposMCommonCommon.csproj, D:reposTAuthAuth.csproj
Attempts
Attempts @ Q1
ls -r -filter "*.csproj" | ForEach-Object {"$_.Directory$_.Name"}
ls -r -filter "*.csrpoj" | select Path
Attempts @ Q2
ls | sls '<ProjectReferences*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project
ls | sls '<ProjectReferences*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project | select Name, Group
ls | sls '<ProjectReferences*Include="([^"]+)"' | ForEach-Object {New-Object PSObject -Property @{Project=$_.Filename; DirectDep=$_.Matches.Groups[1].Value}} | group Project | select Name, Group.DirectDep
The second of the 3 has the closet output to what I’m looking for
Name Group
---- -----
dirs.proj {@{Project=dirs.proj; DirectDep=...M.Common.csproj}, {Project=dirs.proj; DirectDep=...M.Mocks.csproj}, {Project=dirs.proj; DirectDep=...M.StateMachines.csproj}
M.Common.csproj {@{Project=M.Common.csproj; DirectDep=...Common.csproj}, {Project=M.Common.csproj; DirectDep=...Contracts.csproj}}
M.Mocks.csproj {@{Project=M.Mocks.csproj; DirectDep=...Controller.csproj}
M.StateMachines.csproj {@{Project=M.StateMachines.csproj; DirectDep=...Common.csproj}, {Project=M.StateMachines.csproj; DirectDep=...Auth.csproj}}