สคริปต์ของฉันจะกำหนดได้อย่างไรว่าการติดตั้ง Windows Installer update (MSP) บางอย่างสำเร็จหรือล้มเหลว


0

ฉันเขียนสคริปต์ PowerShell (ดูด้านล่าง) เพื่อติดตั้งการอัปเดต MSP จำนวนมาก (ไฟล์ที่มี.mspนามสกุล, ปรับใช้ผ่าน Windows Installer) อย่างใดอย่างหนึ่ง ตอนนี้ฉันต้องการให้สคริปต์นี้บอกฉันด้วยเมื่อการติดตั้งอัพเดต MSP ล้มเหลว

สิ่งที่ฉันได้ลอง: การค้นหารหัสข้อผิดพลาด มีสองวิธี:

  • หนึ่งคือการได้รับรหัสข้อผิดพลาดโดยใช้ $ LASTEXITCODE หลังจากทำงานMSIEXEC.EXEโดยตรง มันน่าเบื่อ
  • อื่น ๆ ที่เกี่ยวข้องกับการเพิ่ม-PassThruสวิทช์ในการStart-Processจัดเก็บผลของมันเป็นวัตถุพูดและอ่านรหัสข้อผิดพลาดโดยใช้$a $a.ExitCodeอย่างนี้:

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

ไม่ได้พิสูจน์ว่ามีประโยชน์ ดูเหมือนว่าmsiexec.exeจะส่งกลับศูนย์เสมอเป็นรหัสทางออก


ในกรณีที่ใครสนใจนี่คือสคริปต์:

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;
}

คุณสามารถค้นหาการปรับปรุงที่ติดตั้งได้อย่างง่ายดายในแผงควบคุม / แอพตั้งค่า
Biswapriyo

คำตอบ:


0

ตรวจสอบเหตุการณ์ Windows สำหรับเหตุการณ์ MSIExec หรือรับเนื้อหาของบันทึกเมื่อทำเสร็จแล้วและตรวจสอบข้อบ่งชี้ความล้มเหลว

ฉันมีสคริปต์ที่ติดตั้ง MSI จากระยะไกลโดยใช้ MSIExec รอให้ MSIExec ปิด (หรือกระบวนการ / บริการเริ่ม) ... ถ้าไม่มีอะไรเกิดขึ้นหลังจากเวลาติดตั้งปกติฉันจะตรวจสอบเส้นทางการบันทึกที่รวมอยู่ในการโทร MSIExec และ ตรวจสอบข้อความล้มเหลวหรือสำเร็จ


ฉันไม่พบเหตุการณ์ Windows ฉันสามารถขอmsiexecให้สร้างบันทึกได้ แต่ฉันจะตีความความสำเร็จหรือความล้มเหลวจากบันทึกนั้นได้โดยทางโปรแกรมอย่างไร นรกฉันจะตีความอะไรจากบันทึกนั้นได้อย่างไร ฉันแน่ใจว่า Microsoft ตั้งใจให้บันทึกนี้เป็นการลงโทษผู้ดูแลระบบไม่ได้ช่วยพวกเขา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.