Я ищу помощь в создании более эффективного кода. В настоящее время у меня есть простой скрипт Powershell (часть более крупного скрипта), который перечисляет элементы из текстового файла (а именно строки, используемой для идентификации установленной программы), а затем пытается удалить каждую из этих строк с помощью msiexec:

$javaUninstall = Get-Content .\jre-uninstall-list.txt
    foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    $app = Get-WmiObject -Class Win32_Product | Where-Object {
        $_.IdentifyingNumber -match "$java"
    }
    &cmd /c "msiexec /uninstall $($app.IdentifyingNumber) /passive /quiet"
}

Этот код корректно удаляет любую версию 32-битной Java из Java 5 и ту, которая присутствует в системе. Однако это занимает вечность. Каждый элемент работает в течение 5-10 секунд, а затем переходит к следующему. Есть ли способ заставить его быстро пропустить версии, которые не найдены? При использовании командного файла это выполняется менее чем за 15 секунд.

3 ответа3

1

Поскольку переменная $java уже содержит IdentifyingNumber, просто используйте ее напрямую с msiexec .

$javaUninstall = Get-Content .\jre-uninstall-list.txt
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    msiexec /uninstall $java /passive /quiet
}
0

Как сказал @dangph, ниже приведен код PowerShell, поэтому вам не нужно вызывать команды CMD /C , и теперь пользователю нужно только заполнить переменные, а не играть с синтаксисом.

Это не так уж и много, как я знаю, но пользователю не нужно беспокоиться о том, чтобы испортить сценарий, который в противном случае может подойти, если ему нужно часто менять сценарий, как я делаю со своими сценариями.

$javaUninstall = Get-Content -Path .\jre-uninstall-list.txt
$args = "/x $java /passive /quiet"
$msi = "msiexec"
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    Start-Process -FilePath $msi -ArgumentList $args -Wait -PassThru
}
-1

Вы можете раскрутить каждый элемент в своем собственном экземпляре PowerShell. Решение, которое я предоставляю, вероятно, будет наиболее ресурсоемким (FYI). Я не хочу брать кредит за чужую работу, поэтому я привожу пример сценария, предоставленный ЗДЕСЬ.

Вы можете встроить пример в функцию, а затем выполнить итерацию функции внутри цикла foreach .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .