Powershell - Desinstalando uma lista de programas demorando muito

0

Estou procurando ajuda para tornar um pouco de código mais eficiente. Eu tenho atualmente um script Powershell simples (parte de um script maior) que enumera itens de um arquivo de texto (ou seja, a seqüência usada para identificar um programa instalado) e, em seguida, tenta desinstalar cada uma dessas seqüências usando 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"
}

Esse código desinstala corretamente qualquer versão do Java de 32 bits do Java 5 e que está presente no sistema. No entanto, demora para sempre . Cada item é executado por 5-10 segundos - e depois passa para o próximo. Existe alguma maneira de tê-lo rapidamente pular as versões que não são encontradas? Usando um arquivo de lote, isso é executado em menos de 15 segundos.

    
por Tim P. 28.04.2014 / 15:50

3 respostas

1

Como a variável $java já contém o IdentifyingNumber, use-a diretamente com msiexec .

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

Como disse o @dangph, aqui está o código do PowerShell abaixo, assim você não precisa chamar os comandos CMD /C , e o usuário agora só precisa preencher as variáveis ao invés de jogar com a sintaxe também.

Não é uma grande mudança que eu sei, mas o usuário não precisa se preocupar com a confusão de um script que, de outra forma, estaria ok, caso precise alterar o script com frequência, como faço com meus scripts.

$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
}
    
por 13.04.2016 / 08:30
-1

Você pode desmembrar cada item em sua própria instância do powershell. A solução que estou fornecendo provavelmente será o mais intensivo em recursos (FYI). Eu não quero levar crédito pelo trabalho de outro, então eu vou linkar o exemplo de script desde AQUI.

Você poderia criar o exemplo em uma função e depois iterar a função dentro do seu foreach loop.

    
por 28.04.2014 / 17:51

Tags