我编写了一个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}
然而,这里有一个问题:在EXE或EXE失败之前,需要删除MSI。有没有办法为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
}
}
编辑
get-package *jabra*
给出了这个输出
Name Version Source ProviderName
---- ------- ------ ------------
Jabra Direct 4.0.8560.0 msi
Jabra Direct 4.0.8560.0 Programs
编辑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
#}
}
}
更改了获取子项的顺序,将MSI放在最上面
发布于 2020-07-14 23:52:49
要检查是否安装了应用程序,请尝试执行以下操作:
if (Get-WMIObject Win32_Product -ErrorAction SilentlyContinue | Where-Object {$_.Name -match "Jabra"}) {
# Package exists
}
Else {
# Package does not exist
}
发布于 2020-07-14 22:29:56
我假设它将同时输出程序和msi提供程序。你可以使用uninstall-package,但只能和msi一起使用。这只适用于powershell 5,还不能在上面使用。
if (get-package 'jabra direct' -provider msi) { 'msi installed' }
https://stackoverflow.com/questions/62897084
复制相似问题