Powershell - 卸载程序列表花费太长时间

Powershell - 卸载程序列表花费太长时间

我正在寻求帮助,使一些代码更高效。我目前有一个简单的 Powershell 脚本(一个较大脚本的一部分),它枚举文本文件中的项目(即用于标识已安装程序的字符串),然后尝试使用 msiexec 卸载每个字符串:

$javaUninstall = Get-Content .\jre-uninstall-list.txt
    foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    $app = Get-WmiObject -Class Win32_Product | Where-Object {
        $_.IdentifyingNumber -match "$java"
    }
    &cmd /c "msiexec /uninstall $($app.IdentifyingNumber) /passive /quiet"
}

此代码可正确卸载系统中存在的 Java 5 及以上版本的任何 32 位 Java。但是,它需要永远。每项运行 5-10 秒 - 然后转到下一项。有没有办法让它快速跳过未找到的版本?使用批处理文件,运行时间不到 15 秒。

答案1

由于$java变量已经包含IdentifyingNumber,因此只需直接使用它即可msiexec

$javaUninstall = Get-Content .\jre-uninstall-list.txt
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    msiexec /uninstall $java /passive /quiet
}

答案2

正如 @dangph 所说,下面是 PowerShell 代码,因此您不必调用CMD /C命令,用户现在只需填写变量,而不必使用语法。

我知道这并没有太大的变化,但是如果用户需要经常更改脚本,就像我对我的脚本所做的那样,他们不必担心弄乱原本没问题的脚本。

$javaUninstall = Get-Content -Path .\jre-uninstall-list.txt
$args = "/x $java /passive /quiet"
$msi = "msiexec"
foreach ($java in $javaUninstall) {
    write-host "Trying", "$java"
    Start-Process -FilePath $msi -ArgumentList $args -Wait -PassThru
}

答案3

您可以在自己的 powershell 实例中分离每个项目。我提供的解决方案可能是最耗费资源的(仅供参考)。我不想将他人的工作成果据为己有,所以我将提供提供的脚本示例链接这里。

您可以将示例构建为一个函数,然后在foreach循环内迭代该函数。

相关内容