Wie kann mein Skript feststellen, ob die Installation eines bestimmten Windows Installer-Updates (MSP) erfolgreich war oder fehlgeschlagen ist?

Wie kann mein Skript feststellen, ob die Installation eines bestimmten Windows Installer-Updates (MSP) erfolgreich war oder fehlgeschlagen ist?

Ich habe ein PowerShell-Skript geschrieben (siehe unten), um eine sehr große Anzahl von MSP-Updates (Dateien mit .mspErweiterungen, die über den Windows Installer bereitgestellt werden) nacheinander zu installieren. Nun möchte ich, dass dieses Skript mir auch mitteilt, wenn die Installation eines MSP-Updates fehlgeschlagen ist.

Was ich versucht habe: Abfrage des Fehlercodes.Es gibt zwei Ansätze:

  • Eine Möglichkeit besteht darin, den Fehlercode mit $LASTEXITCODE nach der MSIEXEC.EXEdirekten Ausführung abzurufen. Das ist mühsam.
  • Die andere Möglichkeit besteht darin , -PassThruswitch zu hinzuzufügen Start-Process, das Ergebnis in einem Objekt zu speichern $aund beispielsweise den Fehlercode mithilfe von auszulesen $a.ExitCode. So:

    $a=Start-Process msiexec.exe -ArgumentList "/p `"$MspRelPath`" /log `"$LogRelPath`" /passive /norestart" -Wait -PassThru
    Write-Host $a.ExitCode
    

Beides erweist sich nicht als nützlich. Es scheint, als msiexec.exewürde als Exit-Code immer Null zurückgegeben.


Falls jemand interessiert ist, hier ist das Skript:

param (
    [parameter(mandatory=$false)][Switch]$BypassAdminPrompt
)
Try 
{
  Clear-Host

  # Get script name
  $ScriptFileObject=(Get-Item $PSCommandPath)
  $ScriptName=$ScriptFileObject.Name
  $ScriptPath=$ScriptFileObject.DirectoryName

  # Load Windows Forms and initialize visual styles
  [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  [System.Windows.Forms.Application]::EnableVisualStyles()

  # Is the script holding administrative privileges?
  $wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
  $prp=new-object System.Security.Principal.WindowsPrincipal($wid)
  $adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
  $IsAdmin=$prp.IsInRole($adm)
  if ($IsAdmin -eq $false) {
    if (!$BypassAdminPrompt) {
      Start-Process powershell.exe -ArgumentList "-ExecutionPolicy $env:PSExecutionPolicyPreference -File `"$PSCommandPath`" -BypassAdminPrompt" -Verb RunAs
    } else {
      $result=[System.Windows.Forms.MessageBox]::Show("This script requires administrative privileges, which are absent.", $ScriptName, "OK", "Error");
    }
    break;
  }

  # Install...
  Set-Location $ScriptPath
  $MSP_list = Get-ChildItem *.msp -Recurse
  if ($MSP_list -eq $null) {
    $result=[System.Windows.Forms.MessageBox]::Show("Nothing found to install.`rSearch path was "+$ScriptPath, $ScriptName, "OK", "Error");
  }
  else
  {
    $MSP_list | ForEach-Object {
      # Ordinarily, I'd pass the path in the form of ".\foldername\filename.msp" but Windows Installer does not accept that.
      # It must be in "foldername\filename.msp" form.
      $MspRelPath = $_.FullName.Substring($ScriptPath.Length+1)
      $LogRelPath = $MspRelPath+".log"
      Write-Host $MspRelPath
      Start-Process msiexec.exe -ArgumentList "/p `"$MspRelPath`" /log `"$LogRelPath`" /passive /norestart" -Wait
    }
    Remove-Variable MspRelPath
    Remove-Variable LogRelPath
    Pause
  }
  Remove-Variable MSP_list
}
Catch
{
  $result=[System.Windows.Forms.MessageBox]::Show("Error!`r`r"+$Error[0], $ScriptName, "OK", "Error");
  break;
}

Antwort1

Überprüfen Sie entweder die Windows-Ereignisse auf MSIExec-Ereignisse oder rufen Sie nach Abschluss den Inhalt der Protokollausgabe ab und suchen Sie nach Fehlermeldungen.

Ich habe ein Skript, das ein MSI remote mit MSIExec installiert und wartet, bis MSIExec geschlossen wird (oder der Prozess/Dienst gestartet wird). Wenn nach einer typischen Installationszeit nichts passiert, überprüfe ich den im MSIExec-Aufruf enthaltenen Protokollpfad und suche nach Fehler- oder Erfolgsmeldungen.

verwandte Informationen