Files
2026-06-02 03:37:09 -07:00

146 lines
4.1 KiB
PowerShell

param(
[string]$JsonOut = $null
)
# Initialize script resolution
$script:resolution = "Unknown"
$script:primaryGPU = $null
Write-Host "Retrieving GPU information using Get-CimInstance..."
try {
$gpus = Get-CimInstance Win32_VideoController -ErrorAction Stop
} catch {
Write-Error "Failed to retrieve GPU info: $_"
return
}
function Get-GPUType {
param($gpuName)
$n = $gpuName.ToLower()
if ($n -match 'meta|virtual|mirage|basic display|remote|vmware|virtualbox|citrix|qxl|parallels|sunshine|parsec') {
return "Virtual / Software GPU"
}
elseif ($n -match 'intel|uhd|iris|hd graphics') {
return "Integrated GPU"
}
elseif ($n -match 'nvidia|geforce|quadro|tesla|rtx|gtx|amd|radeon|rx') {
return "Discrete GPU"
}
return "Unknown GPU Type"
}
# Hold categorized GPUs
$discreteGPUs = @()
$integratedGPUs = @()
$virtualGPUs = @()
$allGPUs = @()
foreach ($gpu in $gpus) {
$name = if ($gpu.Name) { $gpu.Name } else { "Unknown GPU" }
$gpuType = Get-GPUType $name
$videoProcessor = if ($gpu.VideoProcessor) { $gpu.VideoProcessor } else { "Unknown Processor" }
$driverVersion = if ($gpu.DriverVersion) { $gpu.DriverVersion } else { "Unknown Driver Version" }
# RAM
$adapterRAMGB = if ($gpu.AdapterRAM -and $gpu.AdapterRAM -gt 0) {
[math]::Round($gpu.AdapterRAM / 1GB, 2)
} else { 0 }
# Resolution logic
if ($gpu.CurrentHorizontalResolution -and $gpu.CurrentVerticalResolution) {
$res = "{0}x{1}" -f $gpu.CurrentHorizontalResolution, $gpu.CurrentVerticalResolution
} elseif ($gpu.VideoModeDescription -match '(\d+)\s*x\s*(\d+)') {
$res = "{0}x{1}" -f $Matches[1], $Matches[2]
} else {
$res = "Unknown"
}
$gpuInfo = [pscustomobject]@{
Name = $name
Type = $gpuType
RAMGB = $adapterRAMGB
Resolution = $res
DriverVersion = $driverVersion
VideoProcessor = $videoProcessor
}
$allGPUs += $gpuInfo
switch ($gpuType) {
"Discrete GPU" { $discreteGPUs += $gpuInfo }
"Integrated GPU" { $integratedGPUs += $gpuInfo }
"Virtual / Software GPU" { $virtualGPUs += $gpuInfo }
default { $virtualGPUs += $gpuInfo }
}
# Print only hardware GPUs
if ($gpuType -ne "Virtual / Software GPU") {
Write-Host "`n--- GPU Information ---"
Write-Host "GPU Name: $name"
Write-Host "GPU Type: $gpuType"
Write-Host "Video Processor: $videoProcessor"
Write-Host "Adapter RAM: $adapterRAMGB GB"
Write-Host "Driver Version: $driverVersion"
Write-Host "Detected Res: $res"
Write-Host "-----------------------"
}
}
# Determine primary GPU by preference order
foreach ($list in @($discreteGPUs, $integratedGPUs, $virtualGPUs)) {
foreach ($gpu in $list) {
if ($gpu.Resolution -and $gpu.Resolution -ne "Unknown") {
$script:primaryGPU = $gpu
$script:resolution = $gpu.Resolution
break
}
}
if ($script:primaryGPU) { break }
}
# CPU Name
$cpu = "Unknown"
try {
$cpuObj = Get-CimInstance Win32_Processor | Select-Object -First 1
if ($cpuObj -and $cpuObj.Name) { $cpu = $cpuObj.Name.Trim() }
}
catch {}
# RAM
$ram = "Unknown"
try {
$ramObj = Get-CimInstance Win32_ComputerSystem
if ($ramObj -and $ramObj.TotalPhysicalMemory) {
$ram = [math]::Round($ramObj.TotalPhysicalMemory / 1GB, 0)
}
}
catch {}
Write-Host "`n--- Detected System ---"
Write-Host "CPU: $cpu"
Write-Host "RAM: $ram GB"
Write-Host "Primary GPU: $($script:primaryGPU.Name)"
Write-Host "Display Resolution: $script:resolution"
Write-Host "-----------------------"
# Optional JSON Export
if ($JsonOut) {
$output = [pscustomobject]@{
CPU = $cpu
RAM_GB = $ram
PrimaryGPU = $script:primaryGPU
Resolution = $script:resolution
AllGPUs = $allGPUs
}
$output | ConvertTo-Json -Depth 6 | Out-File -Encoding UTF8 $JsonOut
Write-Host "Exported system info to: $JsonOut"
}