Programa de desinstalación de Powershell con msiexec

Me encontré con un problema para que msiexec elimine java con Powershell. Envié mi comando resultante a la pantalla y lo pegué en un archivo por lotes y funciona muy bien. Pero cuando se ejecuta a través de Powershell, falla y dice "no se puede encontrar el paquete". ¿Alguien puede detectar lo que podría estar haciendo mal? Busqué arriba y abajo en Google y probé algunas formas diferentes de ejecutar el comando sin éxito y con el mismo resultado.

cls
$java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java*"}
$msiexec = "c:\windows\system32\msiexec.exe";
#$msiexecargs = '/x:"$app.LocalPackage" /qr'
$msiexecargs = '/uninstall "$app.IdentifyingNumber" /qr /norestart'

if ($java -ne $null)
{
    foreach ($app in $java)
    {
        write-host $app.LocalPackage
        write-host $app.IdentifyingNumber
        #&cmd /c "msiexec /uninstall $app.IdentifyingNumber /passive"
        #Start-Process -FilePath $msiexec -Arg $msiexecargs -Wait -Passthru
        [Diagnostics.Process]::Start($msiexec, $msiexecargs);
    }
}
else { Write-Host "nothing to see here..." }
Write-Host "check end"

El objetivo es usar la secuencia de comandos de inicio de sesión de Windows 7 para eliminar todas las versiones de Java en los sistemas de los usuarios finales y luego instalar la última. Prefiero hacerlo todo Powershell, pero si no puedo hacer que esto funcione, simplemente usaré un archivo por lotes codificado con los GUID de desinstalación.

Las declaraciones de host de escritura tienen el propósito de depurar, solo estoy interesado en la ejecución de msiexec en alguna variación de este formato: msiexec /x {GUID} /passive /norestart

El error que recibo es: "No se pudo abrir este paquete de instalación. Verifique que el paquete exista y que pueda acceder a él, o comuníquese con el proveedor de la aplicación para verificar que se trata de un paquete válido de Windows Installer".

Sé que funciona por sí solo, pero no en este script... así que creo que es una cuestión de sintaxis.

Si tiene alguna pregunta, hágamelo saber.

preguntado el 12 de junio de 12 a las 19:06

1 Respuestas

Primero tienes que saber la diferencia entre esto:

"$app.IdentifyingNumber"

y este

"$($app.IdentifyingNumber)"

Así que creo que querías usar este último (el código es un poco confuso debido a las líneas comentadas):

&cmd /c "msiexec /uninstall $($app.IdentifyingNumber) /passive"

Respondido el 12 de junio de 12 a las 20:06

Lo siento, quería mostrar las otras cosas que probé en el código también. ¿Dónde puedo obtener más información sobre esa modificación que hiciste? Esto funcionó muy bien. ¡Gracias! - grep65535

Creo que el blogs.msdn.com/b/powershell/archive/2006/07/15/… es un buen comienzo Para obtener más información, necesitaría un libro como PowerShell en acción / PowerShell en profundidad, etc. - stej

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.