Automatically finding missing and duplicate files in CSProj (Revisited)
As promised in I have come back to the problem of detecting errors in Visual Studio project files. I have updated the script to now report CS files that are on disk that do not appear in the list of included (and compiled) files in the Project. This has a few limitations, including that it only works with CS files (although the script could be easily amended to look for any file extension you like).
Param(
[string]$filePath = $(throw "You must supply a file path")
)
clear
"--- Working... ---"
$filePath = Resolve-Path $filePath
$xml = ([xml] ( gc $filePath ))
$dirPath = (split-path $filePath)
$filesIncluded = $xml.Project.ItemGroup.Compile `
| % {
if ($_.Include -ne $null)
{
(resolve-path (join-path $dirPath $_.Include)).Path
}
}
$filesOnDisk = gci -Path $dirPath -Include *.cs -Recurse | select -ExpandProperty FullName
$uniquePaths = $filesIncluded | select –unique
$duplicatePaths = Compare-object –referenceobject $uniquePaths –differenceobject $filesIncluded `
| select -ExpandProperty InputObject
$fileDiff = Compare-object –referenceobject $filesIncluded –differenceobject $filesOnDisk
$missingInCsProj = $fileDiff | ? { $_.sideIndicator -eq '=>' } | select -ExpandProperty inputObject
$missingOnDisk = $fileDiff | ? { $_.sideIndicator -eq '<=' } | select -ExpandProperty inputObject
# Just double check whether the files are really missing. They might not be
# cs files or they might be in another project
$missingOnDisk = foreach($path in $missingOnDisk)
{
if(-not (test-path $path)){
$path
}
}
clear
if($missingOnDisk -or $duplicatePaths -or $missingInCsProj)
{
if($missingOnDisk)
{
""
"---- Files in the CSProj missing from disk ----"
$missingOnDisk
}
if($duplicatePaths)
{
""
"---- File paths appearing in the CSProj multiple times ----"
$duplicatePaths
}
if($missingInCsProj)
{
""
"---- .CS files missing from the CSProj ----"
$missingInCsProj
}
}
else
{
"=> No errors found in $filePath"
}
""
I am going to come back to this once more, to automatically fix the CsProj file rather than just reporting on errors.