Working with legacy Windows Server 2003 systems presents unique challenges when trying to identify compressed files. The NTFS file system marks compressed files with a specific attribute flag, but Windows Explorer's search functionality doesn't provide direct filtering for this property.
Here's a PowerShell script that recursively scans directories and outputs compressed items to a text file. This works because NTFS compression sets the Archive file attribute's compression bit (0x800):
# CompressedFilesFinder.ps1
$outputFile = "C:\temp\compressed_files_report.txt"
$searchPath = "C:\"
Get-ChildItem -Path $searchPath -Recurse -Force | Where-Object {
$_.Attributes -match "Compressed"
} | ForEach-Object {
$_.FullName
} | Out-File -FilePath $outputFile
Write-Host "Compressed files report generated at $outputFile"
For a more comprehensive report including size savings:
$report = @()
Get-ChildItem -Path $searchPath -Recurse -Force | Where-Object {
$_.Attributes -match "Compressed"
} | ForEach-Object {
$report += New-Object PSObject -Property @{
Path = $_.FullName
Name = $_.Name
Size = "{0:N2} MB" -f ($_.Length / 1MB)
Type = $_.GetType().Name
LastModified = $_.LastWriteTime
}
}
$report | Export-Csv -Path "C:\temp\compressed_files_detail.csv" -NoTypeInformation
Windows includes a command-line utility that can report compression status:
compact /s:$searchPath /q > compressed_files_report.txt
For servers with millions of files, consider this optimized approach:
$startTime = Get-Date
Write-Host "Starting compressed files scan at $startTime"
$counter = 0
$compressedCount = 0
Get-ChildItem -Path $searchPath -Recurse -Force | ForEach-Object {
$counter++
if ($counter % 1000 -eq 0) {
Write-Progress -Activity "Scanning files" -Status "$counter files processed" -PercentComplete ($counter % 100)
}
if ($_.Attributes -match "Compressed") {
$compressedCount++
$_.FullName | Out-File -FilePath $outputFile -Append
}
}
$endTime = Get-Date
Write-Host "Scan completed at $endTime"
Write-Host "Total files processed: $counter"
Write-Host "Compressed files found: $compressedCount"
The blue color in Windows Explorer corresponds to the FILE_ATTRIBUTE_COMPRESSED flag (0x800) in the file attributes DWORD. PowerShell's Get-ChildItem cmdlet exposes this through the Attributes property, where we check for the "Compressed" string match.
Always include proper error handling for permission issues and long paths:
Get-ChildItem -Path $searchPath -Recurse -Force -ErrorAction SilentlyContinue -ErrorVariable accessErrors | Where-Object {
$_.Attributes -match "Compressed"
} | ForEach-Object {
$_.FullName
} | Out-File -FilePath $outputFile
if ($accessErrors) {
$accessErrors | Out-File -FilePath "C:\temp\compressed_files_errors.log"
}
When dealing with Windows Server file systems, identifying compressed files isn't as straightforward as a simple Explorer search. The blue-colored files in Windows Explorer indicate files with the NTFS compression attribute set. This compression is different from archive formats like ZIP or RAR - it's a filesystem-level compression handled by NTFS.
Here's a comprehensive PowerShell script that will recursively scan directories and output all compressed files to a text file with their full paths:
# Define output file path
$outputFile = "C:\temp\compressed_files_report.txt"
# Get all compressed files recursively from C: drive
$compressedFiles = Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Attributes -band [System.IO.FileAttributes]::Compressed }
# Export results
$compressedFiles | Select-Object FullName | Out-File -FilePath $outputFile
Write-Host "Found $($compressedFiles.Count) compressed files. Report saved to $outputFile"
For more targeted searches, you can modify the script with these variations:
# Search only specific folders
Get-ChildItem -Path "C:\ImportantFolder" -Recurse |
Where-Object { $_.Attributes -match "Compressed" }
# Include only files above certain size
Get-ChildItem -Path C:\ -Recurse -Force |
Where-Object { ($_.Attributes -band [System.IO.FileAttributes]::Compressed) -and ($_.Length -gt 10MB) }
# Export with additional details
Get-ChildItem -Path C:\ -Recurse -Force |
Where-Object { $_.Attributes -band [System.IO.FileAttributes]::Compressed } |
Select-Object FullName, Length, LastWriteTime |
Export-Csv -Path "compressed_files_details.csv" -NoTypeInformation
When scanning entire servers:
- Run scripts during off-peak hours
- Consider limiting depth with -Depth parameter in newer PowerShell versions
- Add error handling for inaccessible folders
- For very large volumes, process in batches
For systems where PowerShell isn't available, you can use this command prompt solution:
compact /s /a C:\ > compressed_files_report.txt
This will generate a report of all compressed files, though the output format requires more parsing than the PowerShell solution.
Create a scheduled task that runs this script weekly and emails the results:
# PowerShell script with email functionality
$compressedFiles = Get-ChildItem -Path C:\ -Recurse -Force |
Where-Object { $_.Attributes -band [System.IO.FileAttributes]::Compressed }
$body = $compressedFiles | Select-Object FullName, Length | ConvertTo-Html
Send-MailMessage -From "server@domain.com" -To "admin@domain.com"
-Subject "Weekly Compressed Files Report" -Body $body -BodyAsHtml
-SmtpServer "smtp.domain.com"