Разобрать вывод, чтобы удалить соответствующие файлы - PullRequest
0 голосов
/ 26 апреля 2019

Следующий скрипт выполняет задачу удаления более старых версий драйверов, расположенных в Windows DriverRepository. В него были внесены изменения для фильтрации драйверов определенного поставщика: Konica Minolta.

Я хочу удалить все драйверы Konica Minolta, независимо от того, являются ли они старыми или нет, и именно здесь у меня возникают трудности. Сценарий возвращает три драйвера принтера Konica, но затем сценарий проверяет, являются ли они старыми / дублирующими и т. Д., Что не требуется. Мне просто нужно удалить то, что изначально возвращается фильтром, например, все драйверы Konica.

$dismOut = Dism /Online /Get-Drivers
$Lines = $dismOut | select -Skip 10  #Discard the first ten lines
$Operation = "theName"
$Drivers = @()

foreach ( $Line in $Lines ) {
    $tmp = $Line
    $txt = $($tmp.Split( ':' ))[1]

    switch ($Operation) {

        'theName' { $Name = $txt
                    $Operation = 'theFileName'
                    break
                  }

        'theFileName' { $FileName = $txt.Trim()
                        $Operation = 'theInbox'
                        break
                      }


        'theInbox' { $Inbox = $txt.Trim()
                    $Operation = 'theClassName'
                    break
                  }

        'theClassName' { $ClassName = $txt.Trim()
                         $Operation = 'theVendor'
                         break
                       }

        'theVendor' { $Vendor = $txt.Trim()
                      $Operation = 'theDate'
                      break
                    }

        'theDate' { # change the date format for easy sorting

                     $tmp = $txt.split( '.' )
                     $txt = "$($tmp[2]).$($tmp[1]).$($tmp[0].Trim())"
                     $Date = $txt
                     $Operation = 'theVersion'
                     break
                   }

        'theVersion' { $Version = $txt.Trim()
                       $Operation = 'theNull'
                       $params = [ordered]@{ 'FileName' = $FileName
                                             'Vendor' = $Vendor
                                             'Date' = $Date
                                             'Name' = $Name
                                             'ClassName' = $ClassName
                                             'Version' = $Version
                                             'Inbox' = $Inbox
                                           }


                        $obj = New-Object -TypeName PSObject -Property $params
                        $Drivers += $obj
                        break
                      }

         'theNull' { $Operation = 'theName'
                    break
                   }

    }

}


Write-Host "ALL INSTALLATION THIRD-PARTY DRIVERS"

$Drivers | sort Filename | where Vendor -eq "KONICA MINOLTA" | ft

Write-Host "Different Versions:"

$last = ''

$NotUnique = @()

foreach ( $Dr in $($Drivers | sort Filename | where Vendor -eq "KONICA MINOLTA") ) {

    if ($Dr.FileName -eq $last  ) {  $NotUnique += $Dr  }

    $last = $Dr.FileName

}

$NotUnique | sort FileName | where Vendor -eq "KONICA MINOLTA" | ft



Write-Host "Outdated Drivers:"

$list = $NotUnique | select -ExpandProperty FileName -Unique

$ToDel = @()

foreach ( $Dr in $list ) {

    Write-Host "Duplicate found..." -ForegroundColor Yellow

    $sel = $Drivers | where { $_.FileName -eq $Dr } | sort date -Descending | select -Skip 1

    $sel | ft

    $ToDel += $sel

}

Write-Host "DRIVERS TO REMOVE:" -ForegroundColor Red

$ToDel | ft

# removing old drivers

foreach ( $item in $ToDel ) {

    $Name = $($item.Name).Trim()

    Write-Host "deleting $Name" -ForegroundColor Yellow

    Write-Host "pnputil.exe -d $Name" -ForegroundColor Yellow

   # Invoke-Expression -Command "pnputil.exe -d $Name"

}

Я прокомментировал строку внизу, которая фактически выполняет удаление, поэтому на самом деле ничего не удаляется.

1 Ответ

0 голосов
/ 26 апреля 2019

Чтобы удалить драйвер, вам нужно снова вызвать DISM с чем-то вроде ...

pnputil /delete-driver <driver>

Эта строка возвращает драйверы Konica ...

$Drivers | sort Filename | where Vendor -eq "KONICA MINOLTA" | ft

Вы можете настроить эту строку, чтобы получить то, что вы хотите ...

foreach ($driver in $($Drivers | where Vendor -eq "KONICA MINOLTA")) {
    pnputil /delete-driver $Driver[0].FileName
}

Возможно, вам придется поиграть с вызовом pnputil; это может помочь. Я не мог проверить это.

Также имеется встроенный модуль Powershell DISM; смотрите здесь для деталей. При этом вы можете вызывать командлеты Get-WindowsDriver и Remove-WindowsDriver. Если pnpUtil или dsim не делают то, что вы хотите, вы можете посмотреть на них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...