用 PowerShell 全自動比對 Windows 驅動版本──DriverCompare 腳本完整分享
想在多台測試機之間快速檢查 BIOS、EC、Windows Build 以及第三方驅動版本差異?這篇文章分享chatGPT製的 DriverCompare 腳本,讓你透過 PowerShell 一鍵產生差異報表,輕鬆掌握版本狀態。
目錄
- 需求與設計目標
- 資料夾結構
- 腳本下載與放置
- 使用流程(Baseline → 比對)
- driversDiff.csv 欄位解析
- 常見錯誤與排除
1 需求與設計目標
- 第一次執行:自動建立 baseline
- 後續執行:比對差異並輸出 driversDiff.csv
- 相容 PowerShell 5.1(移除
?:/??語法)
2 資料夾結構
起始只需要用notepad先建立compare-drivers.ps1 & run.bat,其他檔案會自動建立
compare-drivers
│ compare-drivers.ps1
│ run.bat
│ driversDiff.csv
├─baseline
│ baselineDrivers.csv
│ baselineInfo.txt
└─target
currentDrivers.csv
systemInfo.txt
3 腳本下載與放置
將整個 compare-drivers 資料夾放進 USB 隨身碟或共用資料夾,即可逐台執行。
4 使用流程
4-1 建立 Baseline
- 插上隨身碟 → 執行run.bat
螢幕顯示
Baseline done – move USB to next PC
即完成。
4-2 目標機比對
在其他機器重複執行,完成後會重新產生 driversDiff.csv。
5 driversDiff.csv 欄位解析
| Flag | Item | Baseline | Current | 說明 |
|---|---|---|---|---|
| DIFF | Windows Build | 19045 | 22631 | 系統版本不同 |
| XYZ Audio | 1.0.0.1 | 1.0.0.1 | 相同,Flag 留空 | |
| DIFF | Intel Wi-Fi | 22.230 | 目標機缺少此驅動 |
6 常見錯誤與排除
wmic : … not recognized→ 近版 Win11 移除 WMIC,可忽略 EC 比對或自行安裝 WMIC。Unexpected token '?' …→ 代表載入到舊腳本版本,請更新到本文腳本。- 若畫面顯示
!! Error,請打開 DriverCompare_error.log 追蹤細節。
完整 PowerShell 腳本
# DriverCompare – diff Windows / BIOS / EC & 3rd-party drivers
# PowerShell 5.1 compatible (no ?? ?: ?.)
# Folder layout after first run:
# baseline\baselineDrivers.csv baselineInfo.txt
# target\currentDrivers.csv target\systemInfo.txt
# driversDiff.csv
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# ── paths ───────────────────────────────────────────────
$root = Split-Path -Parent $MyInvocation.MyCommand.Definition
$baselineDir = Join-Path $root 'baseline'
$targetDir = Join-Path $root 'target'
New-Item $baselineDir -ItemType Directory -Force | Out-Null
New-Item $targetDir -ItemType Directory -Force | Out-Null
$baselineDrv = Join-Path $baselineDir 'baselineDrivers.csv'
$baselineInfo = Join-Path $baselineDir 'baselineInfo.txt'
$currentDrv = Join-Path $targetDir 'currentDrivers.csv'
$sysInfoTxt = Join-Path $targetDir 'systemInfo.txt'
$diffCsv = Join-Path $root 'driversDiff.csv'
$errLog = Join-Path $root 'DriverCompare_error.log'
if (Test-Path $currentDrv) { Remove-Item $currentDrv -Force }
function Step($msg){ Write-Host ">>> $msg" -ForegroundColor Cyan }
# ---------- safe WMI/CIM query ----------
function SafeGet($class){
if (-not (Get-CimClass -ErrorAction SilentlyContinue $class)){
throw "WMI class [$class] not found."
}
try { Get-CimInstance $class }
catch { Get-WmiObject $class }
}
# ---------- EC version ----------
function Get-EC{
$b = SafeGet Win32_BIOS
if ($b.EmbeddedControllerMajorVersion){
'{0}.{1}' -f $b.EmbeddedControllerMajorVersion,$b.EmbeddedControllerMinorVersion
} else { '' }
}
# ---------- collect drivers ----------
function CollectDrivers($dest){
Step "Collecting 3rd-party drivers"
SafeGet Win32_PnPSignedDriver |
Where-Object { $_.DriverProviderName -ne 'Microsoft' } |
Select-Object @{n='Device';e={ if($_.DeviceName){ $_.DeviceName.Trim() } else{ 'Unknown' } }},
@{n='Version'; e={ $_.DriverVersion }},
@{n='Provider';e={ if($_.DriverProviderName){ $_.DriverProviderName.Trim() } else{ 'Unknown' } }},
INF |
Sort-Object Device |
Export-Csv $dest -NoTypeInformation -Encoding UTF8
}
function NewRow($flag,$item,$base,$cur){
[pscustomobject]@{ Flag=$flag; Item=$item; Baseline=$base; Current=$cur }
}
# ---------- main ----------
try{
# create baseline if absent
if (-not (Test-Path $baselineDrv)){
Step "Creating baseline"
CollectDrivers $baselineDrv
$line = '{0}|{1}|{2}' -f (SafeGet Win32_OperatingSystem).BuildNumber,
(SafeGet Win32_BIOS).SMBIOSBIOSVersion,
(Get-EC)
$line | Set-Content $baselineInfo -Encoding UTF8
Step "Baseline done – move USB to next PC and run again."
exit
}
# current system info
Step "Gathering current system info"
$curBuild = (SafeGet Win32_OperatingSystem).BuildNumber
$curBIOS = (SafeGet Win32_BIOS).SMBIOSBIOSVersion
$curEC = Get-EC
CollectDrivers $currentDrv
'{0}|{1}|{2}' -f $curBuild,$curBIOS,$curEC | Set-Content $sysInfoTxt -Encoding UTF8
# load baseline
Step "Loading baseline"
$parts = (Get-Content $baselineInfo -Raw).Split('|',3)
$baseBuild,$baseBIOS,$baseEC = $parts
$baseTab = Import-Csv $baselineDrv
$curTab = Import-Csv $currentDrv
# deduplicate baseline (keep highest version)
$baseMap = @{}
foreach($b in $baseTab){
$key = "$($b.Device)|$($b.Provider)"
if ($baseMap[$key]){
if ([version]$b.Version -gt [version]$baseMap[$key]){ $baseMap[$key]=$b.Version }
} else { $baseMap[$key]=$b.Version }
}
# build diff rows
$rows = @()
$flag = ''; if ($baseBuild -ne $curBuild) { $flag = 'DIFF' }
$rows += NewRow $flag 'Windows Build' $baseBuild $curBuild
$flag = ''; if ($baseBIOS -ne $curBIOS ) { $flag = 'DIFF' }
$rows += NewRow $flag 'BIOS Version' $baseBIOS $curBIOS
$flag = ''; if ($baseEC -ne $curEC ) { $flag = 'DIFF' }
$rows += NewRow $flag 'EC Version' $baseEC $curEC
foreach($c in $curTab){
$key="$($c.Device)|$($c.Provider)"
$baseVer=$baseMap[$key]
$flag=''
if ($baseVer){
if ([version]$baseVer -ne [version]$c.Version){ $flag='DIFF' }
$baseMap.Remove($key)|Out-Null
} else { $flag='DIFF' }
if (-not $baseVer){ $baseVer='' }
$rows += NewRow $flag $c.Device $baseVer $c.Version
}
foreach($k in $baseMap.Keys){ # present in baseline but missing now
$dev,$prov = $k -split '\|',2
$rows += NewRow 'DIFF' $dev $baseMap[$k] ''
}
# output
Step "Writing diff -> $diffCsv"
$rows | Export-Csv $diffCsv -NoTypeInformation -Encoding UTF8
Step "Finished. Review driversDiff.csv and target folder"
}
catch{
$_ | Out-File $errLog -Append
Write-Host "!! Error – see DriverCompare_error.log" -ForegroundColor Red
}
完整 run.bat 腳本
@echo off chcp 65001 > nul powershell -NoLogo -ExecutionPolicy Bypass ^ -Command "[Console]::OutputEncoding=[Text.Encoding]::UTF8; & '%~dp0compare-drivers.ps1'" timeout /t 3 /nobreak > nul
結語
以上就是 DriverCompare 的完整教學與程式碼分享。如有改進想法或問題,歡迎在下方留言交流!
留言
張貼留言