# Full D:\ scan for VWP modernization-relevant files. # Outputs CSV with category, full path, size, last write time. $ErrorActionPreference = 'SilentlyContinue' # Extension -> category $extMap = @{ '.vbp' = 'vb6-project' '.vbg' = 'vb6-project-group' '.vbw' = 'vb6-workspace' '.frm' = 'vb6-form' '.frx' = 'vb6-form-resource' '.bas' = 'vb6-module' '.cls' = 'vb6-class' '.ctl' = 'vb6-usercontrol' '.ctx' = 'vb6-usercontrol-resource' '.res' = 'resource' '.mdb' = 'access-mdb' '.accdb' = 'access-accdb' '.rpt' = 'crystal-report' '.ism' = 'installshield-project' '.isproj' = 'installshield-project' } # Folder-name keywords -> tag $folderKeywords = @('darv', 'source', 'orders', 'vwp', 'valleywide', 'denali') $root = 'D:\' $outCsv = 'C:\Users\guru\ClaudeTools\clients\valleywide\app-modernization\source-analysis\D-drive-scan-2026-05-16.csv' $outFolders = 'C:\Users\guru\ClaudeTools\clients\valleywide\app-modernization\source-analysis\D-drive-folders-2026-05-16.csv' $skipDirs = @('$RECYCLE.BIN', 'System Volume Information') $start = Get-Date Write-Host "[INFO] Starting scan of $root at $start" # --- File scan (extension match) --- $results = New-Object System.Collections.Generic.List[object] $fileCount = 0 $lastReport = Get-Date try { $stack = New-Object System.Collections.Generic.Stack[string] $stack.Push($root) while ($stack.Count -gt 0) { $dir = $stack.Pop() # Skip known noise dirs $leaf = Split-Path $dir -Leaf if ($skipDirs -contains $leaf) { continue } try { foreach ($f in [System.IO.Directory]::EnumerateFiles($dir)) { $fileCount++ $ext = [System.IO.Path]::GetExtension($f).ToLower() if ($extMap.ContainsKey($ext)) { try { $fi = [System.IO.FileInfo]::new($f) $results.Add([pscustomobject]@{ Category = $extMap[$ext] Path = $f SizeKB = [math]::Round($fi.Length / 1KB, 1) Modified = $fi.LastWriteTime.ToString('yyyy-MM-dd HH:mm') }) | Out-Null } catch {} } # Progress report every 60s if (((Get-Date) - $lastReport).TotalSeconds -ge 60) { Write-Host "[PROGRESS] $fileCount files seen, $($results.Count) matches, current dir: $dir" $lastReport = Get-Date } } } catch {} try { foreach ($sub in [System.IO.Directory]::EnumerateDirectories($dir)) { $stack.Push($sub) } } catch {} } } catch { Write-Host "[ERROR] $_" } $results | Sort-Object Category, Path | Export-Csv -Path $outCsv -NoTypeInformation -Encoding UTF8 Write-Host "[OK] Wrote $($results.Count) file matches to $outCsv" # --- Folder scan (name match for keywords) --- $folderResults = New-Object System.Collections.Generic.List[object] $dirStack = New-Object System.Collections.Generic.Stack[string] $dirStack.Push($root) while ($dirStack.Count -gt 0) { $dir = $dirStack.Pop() $leaf = Split-Path $dir -Leaf if ($skipDirs -contains $leaf) { continue } $leafLower = $leaf.ToLower() foreach ($kw in $folderKeywords) { if ($leafLower -like "*$kw*") { $folderResults.Add([pscustomobject]@{ Keyword = $kw Path = $dir }) | Out-Null break } } try { foreach ($sub in [System.IO.Directory]::EnumerateDirectories($dir)) { $dirStack.Push($sub) } } catch {} } $folderResults | Sort-Object Keyword, Path | Export-Csv -Path $outFolders -NoTypeInformation -Encoding UTF8 Write-Host "[OK] Wrote $($folderResults.Count) folder matches to $outFolders" $elapsed = (Get-Date) - $start Write-Host "[DONE] Scanned $fileCount files in $([math]::Round($elapsed.TotalMinutes,1)) min" # --- Summary by category --- Write-Host "`n=== Summary by category ===" $results | Group-Object Category | Sort-Object Count -Descending | ForEach-Object { Write-Host ("{0,-25} {1,5}" -f $_.Name, $_.Count) }