MSIUninstaller.exe(控制台应用程序)

下载演示项目- 6.26 KB

介绍

我有一个问题,我必须周期性地将网络上的许多机器回滚到我们的软件的较旧版本(以MSI包的形式分发)。因此,我做了一个简单的控制台应用程序,可以运行从BAT脚本或类似。它允许我卸载计算机上的MSI包,即使我不知道当前安装在计算机上的是哪个版本。而且,如果已经安装了正确的(旧版本),我可以跳过卸载包。

使用的代码

MSIUninstaller.exe调用microsoftmsiexec.exe来处理MSI包的实际卸载。它在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall下的注册表数据库中查找所有已安装的包。然后循环遍历它们以找到与特定输入参数匹配的包,然后卸载它们。该程序允许您指定输入参数,如安静、日志和通配符。

这个函数显示了程序的主要功能:

隐藏,收缩,复制CodeSub Process(ByVal DisplayName As String, ByVal bUninstall As Boolean, _
ByVal bDisplay As Boolean, ByVal bQuiet As Boolean, ByVal bLog As Boolean, _
ByVal strSkip As String)

' Retrieve all the subkeys for the specified key.
Dim names As String() = m_rKey.GetSubKeyNames
Dim version As String = ""
Dim publisher As String = ""
Dim dispName As String = ""
Dim iFound As Integer

For Each s As String In names
    dispName = GetKeyValue(s, "DisplayName")
    If dispName <> "" Then
        If WildCardCompare(dispName, DisplayName) Then
            version = GetKeyValue(s, "DisplayVersion")
            publisher = GetKeyValue(s, "Publisher")
            If strSkip <> "none" And WildCardCompare(version, strSkip) Then
                Continue For
            End If
            Dim cmd As String = Environment.SystemDirectory.ToString + _
            "\MsiExec.exe /x " + s
            If bQuiet Then
                cmd += " /qn"
            End If
            If bLog Then
                cmd += " /lie+c:\MSIUninstaller.log.txt"
            End If
            If Not bDisplay Then
                Console.WriteLine("Publisher       = " + publisher)
                Console.WriteLine("DisplayName     = " + dispName)
                Console.WriteLine("version         = " + version)
                Console.WriteLine("GUID            = " + s)
                Console.WriteLine("EsitmatedSize   = " + (CDbl(GetKeyValue_
    (s, "EstimatedSize")) / 1024).ToString("N2") + " Mb")
                Dim dato As String = GetKeyValue(s, "InstallDate")
                dato = dato.Substring(6) + "-" + dato.Substring(4, 2) + _
                "-" + dato.Substring(0, 4)
                Console.WriteLine("InstallDate     = " + CDate(dato).ToString_
                    ("dd-MMM-yyy"))
                Console.WriteLine("InstallSource   = " + GetKeyValue_
                (s, "InstallSource") + vbLf)
            End If
            If bUninstall Then
                Shell(cmd)
            End If
            iFound += 1
        End If
    End If
Next s
If Not bQuiet And iFound = 0 Then
    Console.WriteLine(DisplayName + " was not found in HKEY_LOCAL_MACHINE\_
Software\Microsoft\Windows\CurrentVersion\Uninstall _
on this computer" + vbLf)
End If

End Sub

Private Function GetKeyValue(ByVal keyName As String, ByVal valueName As String) _
As String
Dim obj As Object = m_rKey.OpenSubKey(keyName).GetValue(valueName)
If Not obj Is Nothing Then
Return obj
Else
Return “”
End If
End Function

Private Function WildCardCompare(ByVal strInput As String, _
ByVal strWildCard As String) As Boolean
strWildCard = “^” + Regex.Escape_
(strWildCard).Replace("*", “.*”).Replace("?", “.”) + “$”
Return Regex.IsMatch(strInput, strWildCard, RegexOptions.IgnoreCase)
End Function

历史

2008年8月7日:初任

本文转载于:http://www.diyabc.com/frontweb/news10684.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值