# Fast scan of mounted VWP1.VHDX for source-of-interest files. $ErrorActionPreference = 'SilentlyContinue' $root = 'F:\' $wantExts = @{ '.vbp'=1; '.vbg'=1; '.vbw'=1; '.frm'=1; '.bas'=1; '.cls'=1; '.ctl'=1; '.scc'=1; '.mdb'=1 } $wantFilenames = @{ 'srcsafe.ini'=1; 'ss.ini'=1; 'ssadmin.exe'=1; 'analyze.exe'=1 } $cutoff = [DateTime]'2020-06-09' $results = New-Object System.Collections.Generic.List[object] $darvFolders = New-Object System.Collections.Generic.List[string] $fileCount = 0 $start = Get-Date $stack = New-Object System.Collections.Generic.Stack[string] $stack.Push($root) while ($stack.Count -gt 0) { $dir = $stack.Pop() $leaf = Split-Path $dir -Leaf if ($leaf -ieq 'Windows' -or $leaf -ieq 'WinSxS' -or $leaf -ieq '$Recycle.Bin' -or $leaf -ieq 'System Volume Information') { # Don't descend into Windows-internal noise # But DO record if name matches darv/source/vwp/orders/vss if ($leaf -imatch 'darv|sourcesafe|vss') { $darvFolders.Add($dir) } continue } if ($leaf -imatch 'darv|sourcesafe|vss|orders|vwp') { $darvFolders.Add($dir) } try { foreach ($f in [System.IO.Directory]::EnumerateFiles($dir)) { $fileCount++ $name = [System.IO.Path]::GetFileName($f).ToLower() $ext = [System.IO.Path]::GetExtension($name) if ($wantExts.ContainsKey($ext) -or $wantFilenames.ContainsKey($name)) { try { $fi = [System.IO.FileInfo]::new($f) $results.Add([pscustomobject]@{ Ext = $ext Name = $name Modified = $fi.LastWriteTime SizeKB = [math]::Round($fi.Length/1KB, 1) Path = $f }) | Out-Null } catch {} } } } catch {} try { foreach ($sub in [System.IO.Directory]::EnumerateDirectories($dir)) { $stack.Push($sub) } } catch {} } $elapsed = (Get-Date) - $start Write-Host "[INFO] Scanned $fileCount files in $([math]::Round($elapsed.TotalSeconds,1))s" Write-Host "[INFO] Found $($results.Count) source-of-interest files, $($darvFolders.Count) Darv/SourceSafe/Orders/VWP folders" Write-Host "" # Surface findings Write-Host "=== Folders matching darv/sourcesafe/vss/orders/vwp on this VHDX ===" $darvFolders | Select-Object -Unique | Sort-Object | ForEach-Object { Write-Host $_ } Write-Host "" Write-Host "=== .vbp / .frm / .bas / .cls / .ctl files NEWER than 2020-06-09 ===" $results | Where-Object { $_.Modified -gt $cutoff -and ('.vbp','.vbg','.vbw','.frm','.bas','.cls','.ctl') -contains $_.Ext } | Sort-Object Modified -Descending | Select-Object -First 50 | Format-Table Modified, SizeKB, Path -AutoSize | Out-String -Width 220 | Write-Host Write-Host "=== srcsafe.ini / ss.ini (SourceSafe repository roots) ===" $results | Where-Object { $_.Name -in @('srcsafe.ini','ss.ini') } | Format-Table Modified, SizeKB, Path -AutoSize | Out-String -Width 220 | Write-Host Write-Host "=== ALL .vbp files (any date) ===" $results | Where-Object { $_.Ext -eq '.vbp' } | Sort-Object Modified -Descending | Select-Object -First 50 | Format-Table Modified, SizeKB, Path -AutoSize | Out-String -Width 220 | Write-Host Write-Host "=== .mdb files (database snapshots) ===" $results | Where-Object { $_.Ext -eq '.mdb' } | Sort-Object Modified -Descending | Select-Object -First 30 | Format-Table Modified, SizeKB, Path -AutoSize | Out-String -Width 220 | Write-Host # Save full results to CSV for the record $outCsv = 'C:\Users\guru\ClaudeTools\clients\valleywide\app-modernization\source-analysis\drive3-2026-05-16\VHDX-scan-VWP1.csv' $results | Sort-Object Modified -Descending | Export-Csv -Path $outCsv -NoTypeInformation -Encoding UTF8 Write-Host "[OK] Full results written to $outCsv"