Symptoms
You have source code in a folder and want to count the total number of lines per file type.
Cause
n/a
Resolution
This script starts in a root folder and recurses. If there is a .gitIgnore file it will ignore files and paths specified within there. Results are saved to a CSV file.
# Define the folder to explore
$folderPath = "C:\PathToProject"
$outputFilePath = "$folderPath\results-summary.csv"
$gitIgnorePath = "$folderPath\.gitignore"
# Function to get the patterns from the .gitignore file
function Get-GitIgnorePatterns {
param (
[string]$gitIgnorePath
)
if (Test-Path $gitIgnorePath) {
Get-Content $gitIgnorePath | Where-Object {
$_ -and -not $_.StartsWith('#') -and -not $_.Trim().StartsWith('!')
}
} else {
return @() # Return empty if no .gitignore found
}
}
# Function to check if a path matches any pattern in the .gitignore
function Is-IgnoredPath {
param (
[string]$path,
[array]$patterns
)
foreach ($pattern in $patterns) {
# Convert gitignore patterns to match file/directory paths in a flexible way
$regexPattern = [regex]::Escape($folderPath + "\" + $pattern).Replace("\\*", ".*").Replace("\\?", ".")
if ($path -like $regexPattern) {
return $true
}
}
return $false
}
# Get all patterns from .gitignore
$gitIgnorePatterns = Get-GitIgnorePatterns -gitIgnorePath $gitIgnorePath
# Initialize a hashtable to store file extensions, file counts, and line counts
$fileStats = @{}
# Get all files from the folder and subfolders
Get-ChildItem -Path $folderPath -Recurse -File | ForEach-Object {
$file = $_
$filePath = $file.FullName
# Skip files and folders that match the .gitignore patterns
if (Is-IgnoredPath -path $filePath -patterns $gitIgnorePatterns) {
return
}
$extension = $file.Extension.ToLower()
# Initialize the extension in the hashtable if it doesn't exist
if (-not $fileStats.ContainsKey($extension)) {
$fileStats[$extension] = @{
FileCount = 0
LineCount = 0
}
}
# Increment the file count
$fileStats[$extension].FileCount++
# Get the number of lines in the file and add to the line count
$lineCount = (Get-Content $file.FullName | Measure-Object -Line).Lines
$fileStats[$extension].LineCount += $lineCount
}
# Prepare the output data as a list of custom objects
$outputData = foreach ($extension in $fileStats.Keys) {
$fileInfo = $fileStats[$extension]
[PSCustomObject]@{
Extension = $extension
FileCount = $fileInfo.FileCount
LineCount = $fileInfo.LineCount
}
}
# Export the data to a CSV file
$outputData | Export-Csv -Path $outputFilePath -NoTypeInformation
# Inform the user
Write-Host "Results exported to $outputFilePath"Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article