Заявление WMIC If / Else для версии программного обеспечения - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь использовать PowerShell для перемещения файлов установки, удаления любой предыдущей версии программного обеспечения, удаления каталогов установки и выполнения файла BAT.

Мой домен наконец обновился и позволил WinRM работать на наших машинах, что значительно упростило удаленное внесение исправлений. Я работаю над своим первым сценарием, включающим обновление Java. Я хочу использовать PowerShell Studio для развертывания сценария. Этот сценарий уничтожит все задачи, к которым присоединена Java, используйте wmic, чтобы запросить установленную версию Java, и вызвать деинсталляцию, а затем Start-Process файл BAT, который сделает установку, а затем очистит себя. Происходит следующее: когда я сталкиваюсь с машиной без Java, я получаю сообщение «Нет доступных экземпляров».

Погуглил и огляделся, я не могу понять свое утверждение If / Else и искал какую-то помощь.

taskkill /F /IM iexplorer.exe
taskkill /F /IM chrome.exe
taskkill /F /IM outlook.exe

wmic product where "name like 'Java%%'" call uninstall /nointeractive

Start-Process -FilePath 'C:\Suppot\Java\java.bat' -Verb runas -Wait

RD /S /Q "C:\support\java"

Я бы хотел увидеть, как машина обновляется и тихо устанавливает Java в фоновом режиме, обновляя Панель управления, чтобы проверить, работает ли она.

Произошло следующее: в коде произошла ошибка, и деинсталляция сработала, и после этого произошла ошибка. При следующем запуске теперь происходит сбой, когда не удается найти версию Java для удаления.

1 Ответ

0 голосов
/ 19 января 2019

Способ написания вашего скрипта не очень хорош.По сути, вы просто запускаете пакетный код в PowerShell.

Для перечисления / уничтожения процессов используйте Get-Process:

Get-Process -Name 'chrome', 'iexplore', 'outlook' | ForEach-Object { $_.Kill() }

Для запросов WMI вы будете использовать Get-WmiObject или Get-CimInstance(последний по сути является модернизированной версией первого), если только вы не действительно стремились к производительностиТогда, и только тогда, вы прибегнете к wmic.

Однако, для вашей конкретной задачи вы бы не использовали WMI, потому что запрос класса Win32_Product считается вреден .Вместо этого найдите в реестре строку удаления, разделите строку и запустите ее через Start-Process.Добавьте аргумент /qn в строку параметров для автоматического удаления.

$path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
Get-ChildItem $path | ForEach-Object {
    Get-ItemProperty -Path $_.PSPath | Where-Object {
        $_.DisplayName -like '*java*'
    } | ForEach-Object {
        $cmd, $params = $_.UninstallString -split ' ', 2
        Start-Process $cmd -ArgumentList "${params} /qn" -Wait
    }
}

Файлы и папки можно удалить с помощью Remove-Item:

Remove-Item 'C:\support\java' -Recurse -Force
...