Powershell: как определить, установлен ли пакет MSI перед удалением EXE? - PullRequest
0 голосов
/ 14 июля 2020

Я сделал сценарий PS для удаления программы под названием Jabra. Он отлично работает, находя две записи:

DisplayName  UninstallString                                                                                       
-----------  ---------------                                                                                       
Jabra Direct "C:\ProgramData\Package Cache\{b1b65c84-0885-49ea-bee4-b9fd0b1c5ce7}\JabraDirectSetup.exe"  /uninstall
Jabra Direct MsiExec.exe /I{C5DCA8EB-FFEC-485B-84F1-924425979106}

, однако вот проблема: необходимо удалить MSI, прежде чем EXE или EXE выйдет из строя. Есть ли способ добавить проверку или что-то для EXE, чтобы проверить, что MSI был удален перед запуском?

Спасибо,

Ste

$UninstJabra = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall  |  Get-ItemProperty | Where-Object {$_.DisplayName -eq "Jabra Direct" } | Select-Object -Property DisplayName,UninstallString 

ForEach ($app in $UninstJabra){
if ($app.UninstallString -like "msiexec.exe*")
{
write-host "uninstalling $($app.DisplayName)....msi"
$app.UninstallString = $app.UninstallString -Replace "msiexec.exe","" -Replace "/I",""
$app.UninstallString = $app.UninstallString.Trim()
Start-Process msiexec.exe -ArgumentList "/X $($app.UninstallString) /qn" -wait
}
else
{
write-host "uninstalling $($app.DisplayName)....exe"
cmd /c $UninstJabra.UninstallString /silent
}
}

edit

get-package *jabra*

дает мне этот результат

Name                           Version          Source                           ProviderName                               
----                           -------          ------                           ------------                               
Jabra Direct                   4.0.8560.0                                        msi                                        
Jabra Direct                   4.0.8560.0                                        Programs

edit 2

Отсортировано таким образом, всем спасибо

$UninstJabra = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object {$_.DisplayName -eq "Jabra Direct" } | Select-Object -Property DisplayName, UninstallString | Sort-Object -Property UninstallString -Descending

ForEach ($app in $UninstJabra){
if ($app.UninstallString -like "msiexec.exe*") {
write-host "uninstalling $($app.DisplayName)....msi"
$app.UninstallString = $app.UninstallString -Replace "msiexec.exe","" -Replace "/I",""
$app.UninstallString = $app.UninstallString.Trim()
Start-Process msiexec.exe -ArgumentList "/X $($app.UninstallString) /qn" -wait
}
else {
 #if ($app.UninstallString -like "*ProgramData*") {
write-host "uninstalling $($app.DisplayName)....exe"
$UninstJabra = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object {$_.DisplayName -eq "Jabra Direct" } | Select-Object -Property DisplayName, UninstallString
cmd /c $UninstJabra.UninstallString /silent
 #}
}
}

изменил порядок для get-childitem, чтобы поставить MSI на первое место

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Чтобы проверить, установлено ли приложение, попробуйте следующее:

if (Get-WMIObject Win32_Product -ErrorAction SilentlyContinue | Where-Object {$_.Name -match "Jabra"}) {
  # Package exists
} 
Else {
  # Package does not exist
}
0 голосов
/ 14 июля 2020

Я предполагаю, что он будет выводить как поставщиков программ, так и msi. Вы можете использовать uninstall-package, но только с файлами msi. Это работает только в PowerShell 5, но не выше.

if (get-package 'jabra direct' -provider msi) { 'msi installed' } 
...