private/BootMedia/WindowsOS/Find-MountedWindowsMedia.ps1
|
#Requires -Version 7.4 function Find-MountedWindowsMedia { <# .SYNOPSIS Scans mounted drives for Windows installation media containing install.wim or install.esd. .DESCRIPTION Enumerates PSDrives D: through Z: and checks each for a Sources directory containing install.wim or install.esd. Also checks x64\Sources and x86\Sources subdirectories for multi-architecture media. Returns file objects with the MediaRoot property added. .OUTPUTS [PSCustomObject] File objects with a MediaRoot calculated property. .NOTES Author: David Segura Version: 0.1.0 #> [CmdletBinding()] param () $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $IsAdmin) { Write-Warning "[$($MyInvocation.MyCommand.Name)] Must be run with Administrator privileges" return } Write-Verbose "[$($MyInvocation.MyCommand.Name)] Scanning PSDrives for Windows installation media" $WindowsMediaDrives = Get-PSDrive -PSProvider 'FileSystem' | Where-Object { ($_.Name).Length -eq 1 } | Where-Object { $_.Name -match '^[D-Z]' } | Where-Object { $_.Root -match '^[D-Z]:\\' } Write-Verbose "[$($MyInvocation.MyCommand.Name)] Found $($WindowsMediaDrives.Count) candidate PSDrives" $WindowsMediaSources = [System.Collections.Generic.List[PSObject]]::new() foreach ($Drive in $WindowsMediaDrives) { $searchPaths = @( "$($Drive.Root)Sources" "$($Drive.Root)x64\Sources" "$($Drive.Root)x86\Sources" ) foreach ($searchPath in $searchPaths) { if (Test-Path $searchPath) { Write-Verbose "[$($MyInvocation.MyCommand.Name)] Checking $searchPath" $found = Get-ChildItem "$searchPath\*" -Include install.wim, install.esd -ErrorAction SilentlyContinue | Select-Object -Property @{Name = 'MediaRoot'; Expression = { (Get-Item $_.Directory).Parent.FullName } }, * if ($found) { foreach ($item in $found) { $WindowsMediaSources.Add($item) } } } } } if ($WindowsMediaSources.Count -gt 0) { Write-Verbose "[$($MyInvocation.MyCommand.Name)] Found $($WindowsMediaSources.Count) Windows media source(s)" return $WindowsMediaSources } else { Write-Verbose "[$($MyInvocation.MyCommand.Name)] No Windows installation media found" return $null } } |