Вчора мав нагоду ще раз скористатися пакетним інсталером драйверів. Але мені, чесно, не вистачило комфорту, а саме таймера виконання. Тому сьогодні буде друга розширена версія.
І зробимо це акуратно, перепишемо скрипт повністю але вже з урахуванням стандартного повзунка (Write-Progress).
Перед самим кодом коротке пояснення логіки - ми спочатку збираємо всі INF, щоб знати загальну кількість, далі йдемо по них циклом і після кожного кроку перемальовуємо прогрес. Інакше відсоток порахувати неможливо - це фундаментальне обмеження pnputil.
І щоб було зрозуміло, що саме ми вважаємо “інстальовано”, pnputil у нормальному режимі повертає текстовий результат, з якого можна визначити:
- драйвер додано та встановлено;
- драйвер вже був у Driver Store;
- або сталася помилка.
Ми не будемо парсити все до символа (це ненадійно між версіями Windows), а використаємо практичний і стабільний підхід:
- якщо pnputil повернув ExitCode = 0 → вважаємо драйвер успішно обробленим;
- зберігаємо шлях до INF у список;
- наприкінці показуємо зведення.
Маємо інженерно прийнятний компроміс між точністю і стабільністю.
Оновлений скрипт:
$DriverPath = "\\server\folder\drivers"
$Drivers = Get-ChildItem -Path $DriverPath -Recurse -Filter *.inf -ErrorAction SilentlyContinue
$Total = $Drivers.Count
$Current = 0
$Start = Get-Date
# Списки для підсумку
$InstalledDrivers = @()
$FailedDrivers = @()
foreach ($Driver in $Drivers) {
$Current++
# Запуск pnputil
$process = Start-Process -FilePath "pnputil.exe" `
-ArgumentList "/add-driver `"$($Driver.FullName)`" /install" `
-Wait -PassThru -NoNewWindow
if ($process.ExitCode -eq 0) {
$InstalledDrivers += $Driver.FullName
}
else {
$FailedDrivers += $Driver.FullName
}
$Percent = [int](($Current / $Total) * 100)
$Elapsed = (Get-Date) - $Start
Write-Progress `
-Activity "Installing drivers" `
-Status "[$Current / $Total] $Percent% | Elapsed: $($Elapsed.ToString('hh\:mm\:ss'))" `
-PercentComplete $Percent
}
Write-Progress -Activity "Installing drivers" -Completed
# ---------- ПІДСУМОК ----------
Write-Host ""
Write-Host "========== DRIVER INSTALLATION SUMMARY ==========" -ForegroundColor Cyan
Write-Host "Total INF found: $Total"
Write-Host "Successfully done: $($InstalledDrivers.Count)"
Write-Host "Failed: $($FailedDrivers.Count)"
Write-Host "Elapsed time: $((Get-Date - $Start).ToString('hh\:mm\:ss'))"
Write-Host ""
if ($InstalledDrivers.Count -gt 0) {
Write-Host "Installed / processed drivers:" -ForegroundColor Green
$InstalledDrivers | ForEach-Object { Write-Host " $_" }
}
if ($FailedDrivers.Count -gt 0) {
Write-Host ""
Write-Host "Failed drivers:" -ForegroundColor Red
$FailedDrivers | ForEach-Object { Write-Host " $_" }
}
Що ми отримали на практиці:
✔ той самий повзунок, який ми бачили у PowerShell
✔ відсоток виконання
✔ таймер з моменту старту
✔ чисту консоль без спаму від pnputil
Цей код однаково добре працює:
- в PowerShell ISE
- у звичайному powershell.exe
- у Windows Terminal
І чесне обмеження (важливо усвідомлювати):
- відсоток = кількість INF, а не реальний час;
- якщо один драйвер “важкий”, повзунок може стояти довше — це нормально;
- точнішого способу без сторонніх утиліт не існує.
Щасти.

No comments:
Post a Comment
А что вы думаете по этому поводу?