%20erfolgreich%20war%20oder%20fehlgeschlagen%20ist%3F.png)
Ich habe ein PowerShell-Skript geschrieben (siehe unten), um eine sehr große Anzahl von MSP-Updates (Dateien mit .msp
Erweiterungen, 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.EXE
direkten Ausführung abzurufen. Das ist mühsam. Die andere Möglichkeit besteht darin ,
-PassThru
switch zu hinzuzufügenStart-Process
, das Ergebnis in einem Objekt zu speichern$a
und 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.exe
wü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.