首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell:如何在删除EXE之前检测MSI包是否已安装?

Powershell:如何在删除EXE之前检测MSI包是否已安装?
EN

Stack Overflow用户
提问于 2020-07-14 22:07:54
回答 2查看 521关注 0票数 0

我编写了一个PS脚本来删除一个名为Jabra的软件。它可以很好地找到以下两个条目:

代码语言:javascript
运行
复制
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}

然而,这里有一个问题:在EXE或EXE失败之前,需要删除MSI。有没有办法为EXE添加一个检查或其他东西,以便在运行之前检查MSI是否已被删除?

谢谢,

Ste

代码语言:javascript
运行
复制
$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
}
}

编辑

代码语言:javascript
运行
复制
get-package *jabra*

给出了这个输出

代码语言:javascript
运行
复制
Name                           Version          Source                           ProviderName                               
----                           -------          ------                           ------------                               
Jabra Direct                   4.0.8560.0                                        msi                                        
Jabra Direct                   4.0.8560.0                                        Programs

编辑2

这样排序的,谢谢大家

代码语言:javascript
运行
复制
$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
 #}
}
}

更改了获取子项的顺序,将MSI放在最上面

EN

Stack Overflow用户

发布于 2020-07-14 22:29:56

我假设它将同时输出程序和msi提供程序。你可以使用uninstall-package,但只能和msi一起使用。这只适用于powershell 5,还不能在上面使用。

代码语言:javascript
运行
复制
if (get-package 'jabra direct' -provider msi) { 'msi installed' } 
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62897084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档