卸载以特定字符串开头的所有软件

Posted

技术标签:

【中文标题】卸载以特定字符串开头的所有软件【英文标题】:Uninstall all software starting with a specific string 【发布时间】:2019-10-22 19:20:27 【问题描述】:

关注this issue,我想卸载所有NI软件。从here 首先在CMD 中输入wmic。然后使用命令product get name我得到一堆以NI开头的软件:

NI Logos 19.0
NI Trace Engine
NI-MXDF 19.0.0f0 for 64 Bit Windows
WIF Core Dependencies Windows 19.0.0
NI-VISA USB Passport 19.0.0
NI-VISA SysAPI x64 support 19.0.0
NI Controller Driver 19.0 64-bit
NI ActiveX Container (64-bit)
Math Kernel Libraries
NI MXS 19.0.0
NI LabWindows/CVI 2019 Network Variable Library
NI-VISA GPIB Passport 19.0.0
NI LabWindows/CVI 2017 Low-Level Driver (Original)
NI-RPC 17.0.0f0 for Phar Lap ETS
NI LabWindows/CVI 2017 .NET Library (64-bit)
...

我可以单独卸载它们,例如:

product where name="NI Logos 19.0" call uninstall

然后我必须选择y/Y。鉴于我必须卸载很多这些软件,我想知道如何使这个过程自动化。步骤应该是这样的:

    找出product get name中所有以NI开头的行并列出来 上面列表中的for循环运行product where name=list[i] call uninstall,默认y/Y

如果您能帮助我解决这个问题,我将不胜感激。提前感谢您的支持。

P.S. Powershell 解决方案也可以。实际上,使用任何其他方式卸载所有这些的任何其他解决方案对我来说都可以。

【问题讨论】:

你忘了说这是wmic 命令,我猜你没有完全按照this Q&A 的提示进行操作 @LotPings 不是 wmic 一个 CMD 命令吗?有什么区别?我没有看到上面的帖子。我用this post。 @Foad %SystemRoot%\System32\wbem\wmic.exe 是一个可执行文件,它输出的文本不是像大多数可执行文件那样每个字符一个字节,而是使用 UTF-16 Little Endian 编码的 Unicode。在处理wmic的文本输出时必须考虑到字符编码的这种差异。 【参考方案1】:

您应该能够将Like 运算符与wmic 一起使用。

来自cmd

WMIC Product Where "Name Like 'NI%'" Call Uninstall /NoInteractive

来自batch-file

WMIC Product Where "Name Like 'NI%%'" Call Uninstall /NoInteractive

没有记录可用于Uninstall 调用的命令行选项,因此这里提供的使用/NoInteractive 更多的是希望,而不是作为您所述提示的最终解决方案。

【讨论】:

试过了,好像是正在卸载软件,但是重启后,一切都还在! 如果是这样,那不是我的回答的错,我使用了与您所说的相同的 WMIC 方法。您是否以管理员身份运行脚本,以确保所需的卸载权限到位? 这确实不是你的答案的错,但我认为我在原帖中介绍的命令是有效的。显然不是这样! 我之前没有看到 Call Uninstall 没有按照您描述的方式工作的迹象,当然不会在调用时出现某种错误,毕竟这是一个记录的这样做的方法。此外,您知道使用 win32_product 仅涵盖使用 Windows Installer 安装的那些产品,不是吗?【参考方案2】:

如果应用程序是从 MSI 安装的,您可以使用以下 PowerShell 代码。如果使用了其他安装程序,您可以将静默卸载参数添加到循环中的$uninstallString

$productNames  = @("^NI")
$uninstallKeys = @('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
                   'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall')

foreach ($key in (Get-ChildItem $uninstallKeys)) 

    foreach ($productName in $productNames)
    
        $name = $key.GetValue("DisplayName")
        if ($name -match $productName) 
        
            $uninstallString = $key.GetValue("UninstallString")
            if ($uninstallString -match "^msiexec(\.| )")
            
                $uninstallString = ($uninstallString -replace "/I","/X" -replace "/X", '/X "' -replace "",'"')  + " /qn /norestart"
            

            Write-Host "Removing '$name' using '$uninstallString'..."
            & cmd.exe /C $uninstallString
        
    

【讨论】:

我不确定我是否理解正确。 “静默卸载参数”是什么意思?如果您能详细说明,我将不胜感激。 好吧,我不知道这些卸载程序需要哪些参数,因此可能需要添加/s/quiet 或其他任何内容,以使其无人值守。但只需在& cmd ... 语句之前添加# 并运行代码。如果所有使用的卸载字符串都以 msiexec 开头,则无需更改任何内容

以上是关于卸载以特定字符串开头的所有软件的主要内容,如果未能解决你的问题,请参考以下文章

Linux如何查找特定字符文件或目录

删除所有以某个字符串开头的类

急!如何批量删除数据库中以特定字符开头和结尾的字符串

如何选择仅以特定前缀开头的字符串

如何检查变量是不是以特定字符串开头? [复制]

bat批量删除特定开头同一类型文件?