А АThursday, 25 December 2025

Ставимо драйвера пакетом #2.

Привіт привіт.

Вчора мав нагоду ще раз скористатися пакетним інсталером драйверів. Але мені, чесно, не вистачило комфорту, а саме таймера виконання. Тому сьогодні буде друга розширена версія.

І зробимо це акуратно, перепишемо скрипт повністю але вже з урахуванням стандартного повзунка (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

А что вы думаете по этому поводу?

Версия на печать

Популярное