Skip to content

Update Fleet-maintained apps - #50456

Closed
fleet-release wants to merge 1 commit into
mainfrom
fma-2608031747
Closed

Update Fleet-maintained apps#50456
fleet-release wants to merge 1 commit into
mainfrom
fma-2608031747

Conversation

@fleet-release

@fleet-release fleet-release commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

  • Bug Fixes

    • Improved Windows MSI installation handling across many maintained applications by recognizing successful installations that complete normally or require a restart.
    • Corrected installer log-file path quoting to ensure installation logs are written reliably.
    • Preserved failure reporting and existing uninstall behavior.
  • Updates

    • Refreshed application versions, download URLs, checksums, and release metadata for selected Windows and macOS applications.

Generated automatically with cmd/maintained-apps.
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/1password/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.OBafyY	2026-08-03 17:57:26.036753407 +0000
+++ /tmp/new.E94Xbe	2026-08-03 17:57:26.036753407 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/7-zip/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.ejJ9J0	2026-08-03 17:57:26.099752864 +0000
+++ /tmp/new.CKKWuG	2026-08-03 17:57:26.099752864 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/8x8-work/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.KDAZHY	2026-08-03 17:57:26.158752355 +0000
+++ /tmp/new.0lsSfQ	2026-08-03 17:57:26.158752355 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/adobe-acrobat-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/advanced-installer/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Q7n5ly	2026-08-03 17:57:26.307751071 +0000
+++ /tmp/new.Tqxnal	2026-08-03 17:57:26.307751071 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aircall/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.33qZ4k	2026-08-03 17:57:26.380750442 +0000
+++ /tmp/new.vYXZew	2026-08-03 17:57:26.380750442 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/airparrot/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.VX8f3V	2026-08-03 17:57:26.449749847 +0000
+++ /tmp/new.m3ZBRU	2026-08-03 17:57:26.449749847 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/alacritty/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.welpU8	2026-08-03 17:57:26.518749253 +0000
+++ /tmp/new.XBLpqz	2026-08-03 17:57:26.518749253 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/alfaview/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.0hdmdw	2026-08-03 17:57:26.578748736 +0000
+++ /tmp/new.zq0os6	2026-08-03 17:57:26.578748736 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/allway-sync/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.XzLVRp	2026-08-03 17:57:26.638748218 +0000
+++ /tmp/new.wYQP4U	2026-08-03 17:57:26.638748218 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-11/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.gwCQyC	2026-08-03 17:57:26.694747736 +0000
+++ /tmp/new.oygTQw	2026-08-03 17:57:26.694747736 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-17/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.gqhSaX	2026-08-03 17:57:26.752747236 +0000
+++ /tmp/new.nYKp0b	2026-08-03 17:57:26.753747227 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-21/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.FwyTTZ	2026-08-03 17:57:26.808746753 +0000
+++ /tmp/new.ISuau1	2026-08-03 17:57:26.808746753 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-24/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Z1jw8V	2026-08-03 17:57:26.881746124 +0000
+++ /tmp/new.gAHFB9	2026-08-03 17:57:26.881746124 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-25/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Ormy5P	2026-08-03 17:57:26.937745641 +0000
+++ /tmp/new.cGnnq4	2026-08-03 17:57:26.937745641 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-26/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.IRVkUw	2026-08-03 17:57:26.993745159 +0000
+++ /tmp/new.klQaxl	2026-08-03 17:57:26.993745159 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.AfU29R	2026-08-03 17:57:27.048744685 +0000
+++ /tmp/new.NA57H8	2026-08-03 17:57:27.049744676 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-jre-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.H3PruW	2026-08-03 17:57:27.103744211 +0000
+++ /tmp/new.azOUwe	2026-08-03 17:57:27.103744211 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-dcv-client/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.RwOBW6	2026-08-03 17:57:27.176743582 +0000
+++ /tmp/new.N0LKFB	2026-08-03 17:57:27.176743582 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-dcv-server/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.wuVxky	2026-08-03 17:57:27.246742978 +0000
+++ /tmp/new.GfsbIK	2026-08-03 17:57:27.247742970 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-redshift-odbc-driver/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.BkoFWb	2026-08-03 17:57:27.306742462 +0000
+++ /tmp/new.JienWL	2026-08-03 17:57:27.306742462 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-workspaces/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.bR2zHN	2026-08-03 17:57:27.377741850 +0000
+++ /tmp/new.c9fB0w	2026-08-03 17:57:27.378741841 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/apidog/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aptakube/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.UQwLKa	2026-08-03 17:57:27.467741074 +0000
+++ /tmp/new.jPSCgp	2026-08-03 17:57:27.467741074 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/arduino-ide/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Lnpnhq	2026-08-03 17:57:27.539740454 +0000
+++ /tmp/new.XGPt68	2026-08-03 17:57:27.539740454 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/audiveris/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.EvPXvE	2026-08-03 17:57:27.597739954 +0000
+++ /tmp/new.7clEsA	2026-08-03 17:57:27.597739954 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/autopsy/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.HumuwF	2026-08-03 17:57:27.667739350 +0000
+++ /tmp/new.0ZwqEQ	2026-08-03 17:57:27.667739350 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aws-cli/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.SfDcLz	2026-08-03 17:57:27.717738919 +0000
+++ /tmp/new.2v0e6L	2026-08-03 17:57:27.717738919 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aws-sam-cli/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.k9jMda	2026-08-03 17:57:27.767738488 +0000
+++ /tmp/new.KCt8Wz	2026-08-03 17:57:27.767738488 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aws-vpn-client/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.nfXxKy	2026-08-03 17:57:27.817738058 +0000
+++ /tmp/new.2L2fWk	2026-08-03 17:57:27.817738058 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.dLLIys	2026-08-03 17:57:27.872737584 +0000
+++ /tmp/new.s4Pq2R	2026-08-03 17:57:27.872737584 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.brQOmK	2026-08-03 17:57:27.926737118 +0000
+++ /tmp/new.VV73W8	2026-08-03 17:57:27.926737118 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/azure-functions-core-tools/windows.json

=== Install // 42c7791f -> 49fc2740 ===

--- /tmp/old.Pqjr0d	2026-08-03 17:57:27.989736575 +0000
+++ /tmp/new.TfvWeV	2026-08-03 17:57:27.989736575 +0000
@@ -11,7 +11,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/beyond-compare/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/bitwig-studio/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.pjRLmA	2026-08-03 17:57:28.096735653 +0000
+++ /tmp/new.6lRaPZ	2026-08-03 17:57:28.096735653 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/blender/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.MOd8DR	2026-08-03 17:57:28.156735136 +0000
+++ /tmp/new.NRWPpw	2026-08-03 17:57:28.156735136 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/bluej/windows.json

=== Install // 29a9338f -> 85459eac ===

--- /tmp/old.IfQvUL	2026-08-03 17:57:28.218734602 +0000
+++ /tmp/new.FaGc49	2026-08-03 17:57:28.218734602 +0000
@@ -7,7 +7,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`" ALLUSERS=2" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`" ALLUSERS=2" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/box-drive/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.J7Gykz	2026-08-03 17:57:28.276734102 +0000
+++ /tmp/new.GbZZF6	2026-08-03 17:57:28.276734102 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/box-tools/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.9eISv0	2026-08-03 17:57:28.331733628 +0000
+++ /tmp/new.et0Oh5	2026-08-03 17:57:28.331733628 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/browserstacklocal/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.5mrawZ	2026-08-03 17:57:28.400733033 +0000
+++ /tmp/new.07rhZc	2026-08-03 17:57:28.400733033 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/bruno/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.xyQE0I	2026-08-03 17:57:28.454732568 +0000
+++ /tmp/new.vj6mkw	2026-08-03 17:57:28.454732568 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/calibre/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.nWmknH	2026-08-03 17:57:28.504732137 +0000
+++ /tmp/new.oW5K1F	2026-08-03 17:57:28.504732137 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/camtasia/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.IZ1ENO	2026-08-03 17:57:28.564731620 +0000
+++ /tmp/new.5mjmfN	2026-08-03 17:57:28.564731620 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/chef-workstation/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.7xIgQx	2026-08-03 17:57:28.619731146 +0000
+++ /tmp/new.OEUVKj	2026-08-03 17:57:28.619731146 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cherry-keys/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.bCcAOL	2026-08-03 17:57:28.688730551 +0000
+++ /tmp/new.LCl2i3	2026-08-03 17:57:28.688730551 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/chrome-remote-desktop/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.SaxOog	2026-08-03 17:57:28.748730034 +0000
+++ /tmp/new.dsltMt	2026-08-03 17:57:28.748730034 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cinc/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.MldsCo	2026-08-03 17:57:28.823729388 +0000
+++ /tmp/new.hZiGpR	2026-08-03 17:57:28.823729388 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cisco-jabber/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.XplZPU	2026-08-03 17:57:28.880728897 +0000
+++ /tmp/new.3BsqQk	2026-08-03 17:57:28.880728897 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cisco-webex-recorder-and-player/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.rTWtyT	2026-08-03 17:57:28.942728362 +0000
+++ /tmp/new.O7ZTnV	2026-08-03 17:57:28.942728362 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/claude/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/clickup/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.wSYSbf	2026-08-03 17:57:29.034727569 +0000
+++ /tmp/new.I70wRn	2026-08-03 17:57:29.034727569 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/clockassist/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.GjoQ3L	2026-08-03 17:57:29.097727026 +0000
+++ /tmp/new.UKArsn	2026-08-03 17:57:29.097727026 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/clockify/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.G5jEpE	2026-08-03 17:57:29.152726552 +0000
+++ /tmp/new.lpHiHU	2026-08-03 17:57:29.152726552 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cloudflare-warp/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.ekoXbs	2026-08-03 17:57:29.209726060 +0000
+++ /tmp/new.ltlBL0	2026-08-03 17:57:29.210726051 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cmake-app/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.39JXNv	2026-08-03 17:57:29.260725619 +0000
+++ /tmp/new.Bq8cCh	2026-08-03 17:57:29.260725619 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/colour-contrast-analyser/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.UexUyF	2026-08-03 17:57:29.330725013 +0000
+++ /tmp/new.MRNvGp	2026-08-03 17:57:29.330725013 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/crashplan/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.tbfGP9	2026-08-03 17:57:29.384724546 +0000
+++ /tmp/new.xTbCQv	2026-08-03 17:57:29.384724546 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/creative-force-kelvin/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.OFzBGn	2026-08-03 17:57:29.434724113 +0000
+++ /tmp/new.JJhdUG	2026-08-03 17:57:29.434724113 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/crestron-airmedia-peripherals/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.k02gbr	2026-08-03 17:57:29.495723585 +0000
+++ /tmp/new.4IVRhb	2026-08-03 17:57:29.495723585 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/crestron-airmedia/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.4Xp0xO	2026-08-03 17:57:29.556723058 +0000
+++ /tmp/new.v8m0cY	2026-08-03 17:57:29.556723058 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cribl-edge/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.T85b1y	2026-08-03 17:57:29.610722590 +0000
+++ /tmp/new.TW23O4	2026-08-03 17:57:29.610722590 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/crisisgo/windows.json

=== Install // 27b04e7a -> 01aaef68 ===

--- /tmp/old.7u6R6O	2026-08-03 17:57:29.672722054 +0000
+++ /tmp/new.kIL9gu	2026-08-03 17:57:29.672722054 +0000
@@ -11,7 +11,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} ISSETUPDRIVEN=1 /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" ISSETUPDRIVEN=1 /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cryptomator/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.FrInpO	2026-08-03 17:57:29.736721500 +0000
+++ /tmp/new.EvA6KF	2026-08-03 17:57:29.736721500 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cyberduck-cli/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.zRRaLc	2026-08-03 17:57:29.799720955 +0000
+++ /tmp/new.Oe7teS	2026-08-03 17:57:29.799720955 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cyberduck/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.VROvNv	2026-08-03 17:57:29.863720401 +0000
+++ /tmp/new.8YMQo6	2026-08-03 17:57:29.863720401 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/db-browser-for-sqlite/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.4qCciu	2026-08-03 17:57:29.939719744 +0000
+++ /tmp/new.XAxHOS	2026-08-03 17:57:29.939719744 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/delinea-connection-manager/windows.json

=== Install // d3f438be -> 00512c4c ===

--- /tmp/old.XPHbCy	2026-08-03 17:57:29.992719285 +0000
+++ /tmp/new.UiBDkY	2026-08-03 17:57:29.992719285 +0000
@@ -12,7 +12,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 MSIINSTALLPERUSER=`"`" /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" ALLUSERS=1 MSIINSTALLPERUSER=`"`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/devolutions-launcher/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.iEuJQN	2026-08-03 17:57:30.049718792 +0000
+++ /tmp/new.cMp7LH	2026-08-03 17:57:30.049718792 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/devolutions-workspace/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QOWWrM	2026-08-03 17:57:30.108718281 +0000
+++ /tmp/new.kfFtWs	2026-08-03 17:57:30.109718273 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/devpod/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.X5fmMC	2026-08-03 17:57:30.171717736 +0000
+++ /tmp/new.LeHYvE	2026-08-03 17:57:30.171717736 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/dngrep/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.wKWJSW	2026-08-03 17:57:30.232717208 +0000
+++ /tmp/new.aoOKsg	2026-08-03 17:57:30.232717208 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/docker/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/draftable-desktop/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.qb6Ula	2026-08-03 17:57:30.332716343 +0000
+++ /tmp/new.VmYXhT	2026-08-03 17:57:30.332716343 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/drofus/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.L6rQRS	2026-08-03 17:57:30.394715807 +0000
+++ /tmp/new.ik0SaW	2026-08-03 17:57:30.394715807 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/dropbox/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.BX8nHF	2026-08-03 17:57:30.451715313 +0000
+++ /tmp/new.tpAod0	2026-08-03 17:57:30.451715313 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/druva-insync/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.KTnYTv	2026-08-03 17:57:30.517714742 +0000
+++ /tmp/new.7qgVfZ	2026-08-03 17:57:30.517714742 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/duo-desktop/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.mot6gm	2026-08-03 17:57:30.585714154 +0000
+++ /tmp/new.o0SfHz	2026-08-03 17:57:30.585714154 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.JKFRKx	2026-08-03 17:57:30.639713687 +0000
+++ /tmp/new.4E2YIa	2026-08-03 17:57:30.639713687 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.rMPB0k	2026-08-03 17:57:30.691713237 +0000
+++ /tmp/new.R7fMkv	2026-08-03 17:57:30.691713237 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.sht0Xu	2026-08-03 17:57:30.743712787 +0000
+++ /tmp/new.FVSzK3	2026-08-03 17:57:30.744712778 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.TxazMj	2026-08-03 17:57:30.794712345 +0000
+++ /tmp/new.O3FnLe	2026-08-03 17:57:30.794712345 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.6wuecu	2026-08-03 17:57:30.848711878 +0000
+++ /tmp/new.caetni	2026-08-03 17:57:30.848711878 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.PfRPhp	2026-08-03 17:57:30.900711428 +0000
+++ /tmp/new.AFILPE	2026-08-03 17:57:30.900711428 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.KzMryG	2026-08-03 17:57:30.957710935 +0000
+++ /tmp/new.oorD6t	2026-08-03 17:57:30.957710935 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.16AEWc	2026-08-03 17:57:31.007710502 +0000
+++ /tmp/new.58e78Q	2026-08-03 17:57:31.007710502 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/egnyte-webedit/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.rftZiL	2026-08-03 17:57:31.069709966 +0000
+++ /tmp/new.1YrdfM	2026-08-03 17:57:31.069709966 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/elevate-uc/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.1UTEgb	2026-08-03 17:57:31.130709438 +0000
+++ /tmp/new.odhRHk	2026-08-03 17:57:31.130709438 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/elgato-control-center/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.DdlXdP	2026-08-03 17:57:31.206708780 +0000
+++ /tmp/new.Cn0HPY	2026-08-03 17:57:31.206708780 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/elgato-stream-deck/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QgTipF	2026-08-03 17:57:31.261708305 +0000
+++ /tmp/new.xru8Tz	2026-08-03 17:57:31.261708305 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/emclient/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.h7phZt	2026-08-03 17:57:31.312707863 +0000
+++ /tmp/new.JbiPvW	2026-08-03 17:57:31.312707863 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/endnote/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.j5LpD5	2026-08-03 17:57:31.373707335 +0000
+++ /tmp/new.F5H1cW	2026-08-03 17:57:31.373707335 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/epic-games/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.9ea4Nn	2026-08-03 17:57:31.433706816 +0000
+++ /tmp/new.kqanTq	2026-08-03 17:57:31.433706816 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/filebeat/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QBXuz6	2026-08-03 17:57:31.488706340 +0000
+++ /tmp/new.h79RoV	2026-08-03 17:57:31.489706332 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/flexwhere/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.iuDdO2	2026-08-03 17:57:31.549705813 +0000
+++ /tmp/new.yJrfxi	2026-08-03 17:57:31.550705804 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/fortify/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.WnQfFJ	2026-08-03 17:57:31.611705276 +0000
+++ /tmp/new.O2r5y8	2026-08-03 17:57:31.611705276 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/gadwin-printscreen-pro/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.wi8oMK	2026-08-03 17:57:31.681704670 +0000
+++ /tmp/new.8n3ign	2026-08-03 17:57:31.681704670 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/gadwin-printscreen/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.jblqOi	2026-08-03 17:57:31.741704151 +0000
+++ /tmp/new.rexK8b	2026-08-03 17:57:31.741704151 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/gadwin-screenrecorder/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QgcFYN	2026-08-03 17:57:31.801703632 +0000
+++ /tmp/new.4USouF	2026-08-03 17:57:31.801703632 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/genesys-cloud/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/genesys-cloud/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.lTJpJR	2026-08-03 17:57:31.903702749 +0000
+++ /tmp/new.6NW2qs	2026-08-03 17:57:31.903702749 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/geogebra-classic/windows.json

=== Install // ebe19da8 -> d43086d9 ===

--- /tmp/old.l0cegw	2026-08-03 17:57:31.958702274 +0000
+++ /tmp/new.PxbITj	2026-08-03 17:57:31.959702265 +0000
@@ -10,7 +10,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/git-extensions/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.yO3bQO	2026-08-03 17:57:32.013701798 +0000
+++ /tmp/new.v4fWUc	2026-08-03 17:57:32.013701798 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/github-desktop/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.XTraEp	2026-08-03 17:57:32.075701261 +0000
+++ /tmp/new.jylkTN	2026-08-03 17:57:32.076701253 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/go/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.1l3FbO	2026-08-03 17:57:32.138700716 +0000
+++ /tmp/new.dpeaNk	2026-08-03 17:57:32.138700716 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/google-ads-editor/windows.json

=== Install // bdccfcda -> 351845b5 ===

--- /tmp/old.HNMtfB	2026-08-03 17:57:32.190700266 +0000
+++ /tmp/new.6VyAXa	2026-08-03 17:57:32.190700266 +0000
@@ -11,7 +11,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/google-chrome/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.lD9PCI	2026-08-03 17:57:32.242699816 +0000
+++ /tmp/new.wpnn6t	2026-08-03 17:57:32.242699816 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/google-credential-provider-for-windows/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.OxIUe6	2026-08-03 17:57:32.304699280 +0000
+++ /tmp/new.7udQNb	2026-08-03 17:57:32.304699280 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/gotomeeting/windows.json

=== Install // 36ce6af0 -> a6c7d24e ===

--- /tmp/old.2LXreY	2026-08-03 17:57:32.387698562 +0000
+++ /tmp/new.VMtEQy	2026-08-03 17:57:32.387698562 +0000
@@ -8,7 +8,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`" G2MINSTALLFORALLUSERS=1" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`" G2MINSTALLFORALLUSERS=1" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/grammarly-desktop/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/granola/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/grepwin/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.uEfzEG	2026-08-03 17:57:32.520697411 +0000
+++ /tmp/new.xwgQdb	2026-08-03 17:57:32.521697402 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jdk-11/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Q0HqZL	2026-08-03 17:57:32.571696969 +0000
+++ /tmp/new.6ciAot	2026-08-03 17:57:32.571696969 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jdk-17/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.foj8jf	2026-08-03 17:57:32.622696528 +0000
+++ /tmp/new.g5Xols	2026-08-03 17:57:32.622696528 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jdk-21/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.TMnCxm	2026-08-03 17:57:32.674696078 +0000
+++ /tmp/new.t7lZrG	2026-08-03 17:57:32.674696078 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jdk-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.VQslGW	2026-08-03 17:57:32.725695637 +0000
+++ /tmp/new.YqKLOQ	2026-08-03 17:57:32.725695637 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jre-11/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.EiaWXl	2026-08-03 17:57:32.782695144 +0000
+++ /tmp/new.c4ciFG	2026-08-03 17:57:32.782695144 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jre-17/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.tMiD76	2026-08-03 17:57:32.833694702 +0000
+++ /tmp/new.lRjk7t	2026-08-03 17:57:32.833694702 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jre-21/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.GrizYp	2026-08-03 17:57:32.884694261 +0000
+++ /tmp/new.fTTjmn	2026-08-03 17:57:32.884694261 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ibm-semeru-jre-8/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.hQSb1e	2026-08-03 17:57:32.935693820 +0000
+++ /tmp/new.i1l95X	2026-08-03 17:57:32.935693820 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/imageglass/windows.json

=== Install // e7eaf6bb -> 72349997 ===

--- /tmp/old.TN7ooj	2026-08-03 17:57:32.986693379 +0000
+++ /tmp/new.SguO4Z	2026-08-03 17:57:32.986693379 +0000
@@ -9,7 +9,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/imhex/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.JPPt7Z	2026-08-03 17:57:33.061692730 +0000
+++ /tmp/new.bW7Ul8	2026-08-03 17:57:33.062692721 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/inkscape/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.BOQm5f	2026-08-03 17:57:33.140692046 +0000
+++ /tmp/new.g0DSGA	2026-08-03 17:57:33.140692046 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ironpython/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.qqTB7g	2026-08-03 17:57:33.196691561 +0000
+++ /tmp/new.UF6V6L	2026-08-03 17:57:33.196691561 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/jami/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QjLtrc	2026-08-03 17:57:33.270690921 +0000
+++ /tmp/new.SKpRz4	2026-08-03 17:57:33.270690921 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/keepassxc/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.rkXwgM	2026-08-03 17:57:33.349690237 +0000
+++ /tmp/new.zHehSB	2026-08-03 17:57:33.349690237 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/lapce/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.FCiQjr	2026-08-03 17:57:33.424689589 +0000
+++ /tmp/new.S4pXWL	2026-08-03 17:57:33.424689589 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/lastpass/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.V9T01x	2026-08-03 17:57:33.487689043 +0000
+++ /tmp/new.39n8kD	2026-08-03 17:57:33.487689043 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/libreoffice/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.TgM5E7	2026-08-03 17:57:33.542688568 +0000
+++ /tmp/new.Lt1pqd	2026-08-03 17:57:33.542688568 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/mattermost/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.YradXF	2026-08-03 17:57:33.613687953 +0000
+++ /tmp/new.ok8Oic	2026-08-03 17:57:33.614687944 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/microsoft-edge/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.8LhqQI	2026-08-03 17:57:33.663687521 +0000
+++ /tmp/new.LpVhpe	2026-08-03 17:57:33.663687521 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/mixxx/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.ywvE4g	2026-08-03 17:57:33.740686854 +0000
+++ /tmp/new.eUew96	2026-08-03 17:57:33.741686846 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/mongodb-compass/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.IglGOK	2026-08-03 17:57:33.803686309 +0000
+++ /tmp/new.zwtZTv	2026-08-03 17:57:33.804686300 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/mysqlworkbench/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.j5XNUY	2026-08-03 17:57:33.885685600 +0000
+++ /tmp/new.zjaNKA	2026-08-03 17:57:33.885685600 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/naps2/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.anRBvf	2026-08-03 17:57:33.943685098 +0000
+++ /tmp/new.Uypqgp	2026-08-03 17:57:33.943685098 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/nessus-agent/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.5xr58S	2026-08-03 17:57:33.999684613 +0000
+++ /tmp/new.gJuya7	2026-08-03 17:57:34.000684605 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/nextcloud/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.QhZRuj	2026-08-03 17:57:34.055684129 +0000
+++ /tmp/new.nKsRix	2026-08-03 17:57:34.055684129 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/nodejs/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.pGtfx6	2026-08-03 17:57:34.106683687 +0000
+++ /tmp/new.OPWXQ6	2026-08-03 17:57:34.106683687 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/openvpn-connect/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.HBQ8uG	2026-08-03 17:57:34.188682978 +0000
+++ /tmp/new.UZSkrV	2026-08-03 17:57:34.188682978 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/p4v/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.BDgzl0	2026-08-03 17:57:34.259682363 +0000
+++ /tmp/new.hL67Fr	2026-08-03 17:57:34.259682363 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/pdfsam-basic/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.BhxSAW	2026-08-03 17:57:34.324681801 +0000
+++ /tmp/new.fRumHa	2026-08-03 17:57:34.324681801 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/powershell/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.q4pJdO	2026-08-03 17:57:34.382681299 +0000
+++ /tmp/new.JSsEVP	2026-08-03 17:57:34.382681299 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/prisma-browser/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.T2gOr2	2026-08-03 17:57:34.436680832 +0000
+++ /tmp/new.xWu1y8	2026-08-03 17:57:34.436680832 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/putty/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.hqcPrf	2026-08-03 17:57:34.521680096 +0000
+++ /tmp/new.yneZU2	2026-08-03 17:57:34.521680096 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/reflector/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.REGKx4	2026-08-03 17:57:34.602679396 +0000
+++ /tmp/new.xcf6yT	2026-08-03 17:57:34.603679387 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/remote-desktop-manager/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.DUz0xu	2026-08-03 17:57:34.663678868 +0000
+++ /tmp/new.1ifmGq	2026-08-03 17:57:34.663678868 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/rider/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/royal-tsx/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Wo87T4	2026-08-03 17:57:34.763678002 +0000
+++ /tmp/new.oulm10	2026-08-03 17:57:34.763678002 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/shapr3d/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/sharefile/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.xMYQeO	2026-08-03 17:57:34.881676981 +0000
+++ /tmp/new.cQ1nY3	2026-08-03 17:57:34.881676981 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/snagit/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.RUX3GA	2026-08-03 17:57:34.968676229 +0000
+++ /tmp/new.gewlpC	2026-08-03 17:57:34.968676229 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.vYh9fr	2026-08-03 17:57:35.024675744 +0000
+++ /tmp/new.aXp1GL	2026-08-03 17:57:35.024675744 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/sourcetree/windows.json

=== Install // 17f62246 -> e23ea804 ===

--- /tmp/old.ENcRhY	2026-08-03 17:57:35.110675000 +0000
+++ /tmp/new.9Zwkmy	2026-08-03 17:57:35.111674991 +0000
@@ -3,7 +3,7 @@
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`" ACCEPTEULA=1" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`" ACCEPTEULA=1" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/tailscale/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.Ej0B1v	2026-08-03 17:57:35.167674507 +0000
+++ /tmp/new.KeHGwp	2026-08-03 17:57:35.167674507 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/textexpander/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.YF27am	2026-08-03 17:57:35.244673840 +0000
+++ /tmp/new.uyiBwt	2026-08-03 17:57:35.244673840 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/tightvnc/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.bCmTZh	2026-08-03 17:57:35.300673356 +0000
+++ /tmp/new.bJB5tc	2026-08-03 17:57:35.300673356 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/topaz-gigapixel-ai/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.9RL7qe	2026-08-03 17:57:35.383672638 +0000
+++ /tmp/new.pxln8J	2026-08-03 17:57:35.383672638 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/topaz-photo-ai/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.MVMouw	2026-08-03 17:57:35.466671920 +0000
+++ /tmp/new.tV4x0T	2026-08-03 17:57:35.466671920 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/tortoisegit/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.yD405m	2026-08-03 17:57:35.539671288 +0000
+++ /tmp/new.Wtszlc	2026-08-03 17:57:35.539671288 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/tower/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.8Xsnyw	2026-08-03 17:57:35.604670726 +0000
+++ /tmp/new.Sorpzq	2026-08-03 17:57:35.604670726 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/transmission/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.0713G2	2026-08-03 17:57:35.670670154 +0000
+++ /tmp/new.rds768	2026-08-03 17:57:35.671670146 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/twingate/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.tcnORJ	2026-08-03 17:57:35.754669428 +0000
+++ /tmp/new.xdrFbS	2026-08-03 17:57:35.754669428 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/ultimaker-cura/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.T0mWMF	2026-08-03 17:57:35.836668718 +0000
+++ /tmp/new.KFTZG6	2026-08-03 17:57:35.836668718 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/vlc/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.xPC1Sn	2026-08-03 17:57:35.934667870 +0000
+++ /tmp/new.q20C9D	2026-08-03 17:57:35.934667870 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/wave/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.kd0DkB	2026-08-03 17:57:36.018667143 +0000
+++ /tmp/new.xciUvh	2026-08-03 17:57:36.018667143 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/weasis/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.8VwwIv	2026-08-03 17:57:36.085666563 +0000
+++ /tmp/new.HBMmc3	2026-08-03 17:57:36.085666563 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/webex/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.ldH13U	2026-08-03 17:57:36.147666027 +0000
+++ /tmp/new.tf8Lfr	2026-08-03 17:57:36.147666027 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/windirstat/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.nYMSkS	2026-08-03 17:57:36.199665577 +0000
+++ /tmp/new.OokgPg	2026-08-03 17:57:36.199665577 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/winlogbeat/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.adqeIF	2026-08-03 17:57:36.259665058 +0000
+++ /tmp/new.5IGtA5	2026-08-03 17:57:36.259665058 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/wireshark/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.YgH1BE	2026-08-03 17:57:36.327664470 +0000
+++ /tmp/new.RhNeYE	2026-08-03 17:57:36.327664470 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/wrike/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.mDHOCC	2026-08-03 17:57:36.416663699 +0000
+++ /tmp/new.AEKPb3	2026-08-03 17:57:36.416663699 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/yarn/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.zzr5Ty	2026-08-03 17:57:36.474663198 +0000
+++ /tmp/new.dVXqzD	2026-08-03 17:57:36.474663198 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/yubico-authenticator/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.TtXKJM	2026-08-03 17:57:36.542662609 +0000
+++ /tmp/new.B6x7Yg	2026-08-03 17:57:36.542662609 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.ddQBcb	2026-08-03 17:57:36.599662116 +0000
+++ /tmp/new.xoFibh	2026-08-03 17:57:36.600662107 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/zoom/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.S7vFpq	2026-08-03 17:57:36.661661579 +0000
+++ /tmp/new.gOjcEH	2026-08-03 17:57:36.662661571 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/zulip/windows.json

=== Install // 8959087b -> 22e48c46 ===

--- /tmp/old.25PXll	2026-08-03 17:57:36.739660905 +0000
+++ /tmp/new.PJmEzz	2026-08-03 17:57:36.739660905 +0000
@@ -1,13 +1,21 @@
 $logFile = "${env:TEMP}/fleet-install-software.log"
 
+# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
+# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$successCodes = @(0, 3010, 1641)
+
 try {
 
 $installProcess = Start-Process msiexec.exe `
-  -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
+  -ArgumentList "/quiet /norestart /lv `"${logFile}`" /i `"${env:INSTALLER_PATH}`"" `
   -PassThru -Verb RunAs -Wait
 
 Get-Content $logFile -Tail 500
 
+if ($successCodes -contains $installProcess.ExitCode) {
+  Exit 0
+}
+
 Exit $installProcess.ExitCode
 
 } catch {

=== Uninstall Script (no changes) ===

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Updated maintained-app manifests across Windows and macOS. Most Windows installers now accept MSI exit codes 0, 3010, and 1641 as success and quote log-file paths. Several app versions, download URLs, and SHA-256 checksums were also updated.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description states the purpose but omits the required issue reference, checklist responses, and testing details. Add the related issue or mark it not applicable, complete applicable checklist items, and document testing performed.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the update to Fleet-maintained apps and matches the primary changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fma-2608031747

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ee/maintained-apps/outputs/advanced-installer/windows.json`:
- Line 20: Update the embedded MSI installation script around Start-Process,
$installProcess, and $logFile to validate $env:INSTALLER_PATH with Test-Path
before launching, configure non-zero process exit handling safely, and verify
the log exists before Get-Content; preserve the existing $successCodes behavior
and catch launch failures with a non-zero exit. Apply the same changes in
ee/maintained-apps/outputs/advanced-installer/windows.json:20-20,
ee/maintained-apps/outputs/aircall/windows.json:19-19,
ee/maintained-apps/outputs/airparrot/windows.json:21-21,
ee/maintained-apps/outputs/alacritty/windows.json:20-20,
ee/maintained-apps/outputs/elgato-control-center/windows.json:20-20,
ee/maintained-apps/outputs/elgato-stream-deck/windows.json:20-20,
ee/maintained-apps/outputs/emclient/windows.json:21-21,
ee/maintained-apps/outputs/endnote/windows.json:20-20,
ee/maintained-apps/outputs/epic-games/windows.json:20-20,
ee/maintained-apps/outputs/filebeat/windows.json:20-20, and
ee/maintained-apps/outputs/flexwhere/windows.json:20-20.

In `@ee/maintained-apps/outputs/aws-sam-cli/windows.json`:
- Line 20: Update the installer PowerShell script in every referenced
windows.json entry: ee/maintained-apps/outputs/aws-sam-cli/windows.json:20-20,
ee/maintained-apps/outputs/aws-vpn-client/windows.json:20-20,
ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json:19-19,
ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json:19-19,
ee/maintained-apps/outputs/azure-functions-core-tools/windows.json:20-20,
ee/maintained-apps/outputs/ironpython/windows.json:20-20,
ee/maintained-apps/outputs/jami/windows.json:20-20,
ee/maintained-apps/outputs/keepassxc/windows.json:20-20,
ee/maintained-apps/outputs/lapce/windows.json:20-20,
ee/maintained-apps/outputs/lastpass/windows.json:20-20,
ee/maintained-apps/outputs/libreoffice/windows.json:20-20, and
ee/maintained-apps/outputs/mattermost/windows.json:21-21. Add ErrorAction Stop
to Start-Process so failures reach the catch block, and handle Get-Content
separately so a missing log does not alter the MSI exit-code result.

In `@ee/maintained-apps/outputs/bluej/windows.json`:
- Line 19: Update the BlueJ MSI script’s exit handling after Start-Process
completes so exit codes 3010 and 1641 are treated as successful installs, while
preserving the existing behavior for code 0 and returning failures unchanged.
Use the existing $installProcess.ExitCode flow before the catch block.

In `@ee/maintained-apps/outputs/cinc/windows.json`:
- Line 20: Update the msiexec result check in the uninstaller loop to treat exit
codes 0, 3010, and 1641 as successful. Keep logging and returning unexpected
nonzero exit codes through the existing failure path, while allowing
reboot-required codes to complete with the final success exit.

In `@ee/maintained-apps/outputs/devolutions-workspace/windows.json`:
- Line 20: Update the shared MSI installer script to add ErrorAction Stop to
both Start-Process and Get-Content, ensuring launch and log-read failures enter
catch; then regenerate the manifests. Apply the regenerated change at
ee/maintained-apps/outputs/devolutions-workspace/windows.json:20,
devpod/windows.json:20, dngrep/windows.json:20,
draftable-desktop/windows.json:20, drofus/windows.json:20,
dropbox/windows.json:19, druva-insync/windows.json:20,
duo-desktop/windows.json:21, eclipse-temurin-jdk-11/windows.json:21, and
eclipse-temurin-jdk-17/windows.json:20.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 78d32267-6a69-40dd-8932-b372294fffdc

📥 Commits

Reviewing files that changed from the base of the PR and between 237a6d3 and 7fbf24a.

📒 Files selected for processing (176)
  • ee/maintained-apps/outputs/1password/windows.json
  • ee/maintained-apps/outputs/7-zip/windows.json
  • ee/maintained-apps/outputs/8x8-work/windows.json
  • ee/maintained-apps/outputs/adobe-acrobat-pro/windows.json
  • ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json
  • ee/maintained-apps/outputs/advanced-installer/windows.json
  • ee/maintained-apps/outputs/aircall/windows.json
  • ee/maintained-apps/outputs/airparrot/windows.json
  • ee/maintained-apps/outputs/alacritty/windows.json
  • ee/maintained-apps/outputs/alfaview/windows.json
  • ee/maintained-apps/outputs/allway-sync/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-11/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-17/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-21/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-24/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-25/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-26/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-8/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-jre-8/windows.json
  • ee/maintained-apps/outputs/amazon-dcv-client/windows.json
  • ee/maintained-apps/outputs/amazon-dcv-server/windows.json
  • ee/maintained-apps/outputs/amazon-redshift-odbc-driver/windows.json
  • ee/maintained-apps/outputs/amazon-workspaces/windows.json
  • ee/maintained-apps/outputs/apidog/darwin.json
  • ee/maintained-apps/outputs/aptakube/windows.json
  • ee/maintained-apps/outputs/arduino-ide/windows.json
  • ee/maintained-apps/outputs/audiveris/windows.json
  • ee/maintained-apps/outputs/autopsy/windows.json
  • ee/maintained-apps/outputs/aws-cli/windows.json
  • ee/maintained-apps/outputs/aws-sam-cli/windows.json
  • ee/maintained-apps/outputs/aws-vpn-client/windows.json
  • ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json
  • ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json
  • ee/maintained-apps/outputs/azure-functions-core-tools/windows.json
  • ee/maintained-apps/outputs/beyond-compare/darwin.json
  • ee/maintained-apps/outputs/bitwig-studio/windows.json
  • ee/maintained-apps/outputs/blender/windows.json
  • ee/maintained-apps/outputs/bluej/windows.json
  • ee/maintained-apps/outputs/box-drive/windows.json
  • ee/maintained-apps/outputs/box-tools/windows.json
  • ee/maintained-apps/outputs/browserstacklocal/windows.json
  • ee/maintained-apps/outputs/bruno/windows.json
  • ee/maintained-apps/outputs/calibre/windows.json
  • ee/maintained-apps/outputs/camtasia/windows.json
  • ee/maintained-apps/outputs/chef-workstation/windows.json
  • ee/maintained-apps/outputs/cherry-keys/windows.json
  • ee/maintained-apps/outputs/chrome-remote-desktop/windows.json
  • ee/maintained-apps/outputs/cinc/windows.json
  • ee/maintained-apps/outputs/cisco-jabber/windows.json
  • ee/maintained-apps/outputs/cisco-webex-recorder-and-player/windows.json
  • ee/maintained-apps/outputs/claude/darwin.json
  • ee/maintained-apps/outputs/clickup/windows.json
  • ee/maintained-apps/outputs/clockassist/windows.json
  • ee/maintained-apps/outputs/clockify/windows.json
  • ee/maintained-apps/outputs/cloudflare-warp/windows.json
  • ee/maintained-apps/outputs/cmake-app/windows.json
  • ee/maintained-apps/outputs/colour-contrast-analyser/windows.json
  • ee/maintained-apps/outputs/crashplan/windows.json
  • ee/maintained-apps/outputs/creative-force-kelvin/windows.json
  • ee/maintained-apps/outputs/crestron-airmedia-peripherals/windows.json
  • ee/maintained-apps/outputs/crestron-airmedia/windows.json
  • ee/maintained-apps/outputs/cribl-edge/windows.json
  • ee/maintained-apps/outputs/crisisgo/windows.json
  • ee/maintained-apps/outputs/cryptomator/windows.json
  • ee/maintained-apps/outputs/cyberduck-cli/windows.json
  • ee/maintained-apps/outputs/cyberduck/windows.json
  • ee/maintained-apps/outputs/db-browser-for-sqlite/windows.json
  • ee/maintained-apps/outputs/delinea-connection-manager/windows.json
  • ee/maintained-apps/outputs/devolutions-launcher/windows.json
  • ee/maintained-apps/outputs/devolutions-workspace/windows.json
  • ee/maintained-apps/outputs/devpod/windows.json
  • ee/maintained-apps/outputs/dngrep/windows.json
  • ee/maintained-apps/outputs/docker/windows.json
  • ee/maintained-apps/outputs/draftable-desktop/windows.json
  • ee/maintained-apps/outputs/drofus/windows.json
  • ee/maintained-apps/outputs/dropbox/windows.json
  • ee/maintained-apps/outputs/druva-insync/windows.json
  • ee/maintained-apps/outputs/duo-desktop/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json
  • ee/maintained-apps/outputs/egnyte-webedit/windows.json
  • ee/maintained-apps/outputs/elevate-uc/windows.json
  • ee/maintained-apps/outputs/elgato-control-center/windows.json
  • ee/maintained-apps/outputs/elgato-stream-deck/windows.json
  • ee/maintained-apps/outputs/emclient/windows.json
  • ee/maintained-apps/outputs/endnote/windows.json
  • ee/maintained-apps/outputs/epic-games/windows.json
  • ee/maintained-apps/outputs/filebeat/windows.json
  • ee/maintained-apps/outputs/flexwhere/windows.json
  • ee/maintained-apps/outputs/fortify/windows.json
  • ee/maintained-apps/outputs/gadwin-printscreen-pro/windows.json
  • ee/maintained-apps/outputs/gadwin-printscreen/windows.json
  • ee/maintained-apps/outputs/gadwin-screenrecorder/windows.json
  • ee/maintained-apps/outputs/genesys-cloud/darwin.json
  • ee/maintained-apps/outputs/genesys-cloud/windows.json
  • ee/maintained-apps/outputs/geogebra-classic/windows.json
  • ee/maintained-apps/outputs/git-extensions/windows.json
  • ee/maintained-apps/outputs/github-desktop/windows.json
  • ee/maintained-apps/outputs/go/windows.json
  • ee/maintained-apps/outputs/google-ads-editor/windows.json
  • ee/maintained-apps/outputs/google-chrome/windows.json
  • ee/maintained-apps/outputs/google-credential-provider-for-windows/windows.json
  • ee/maintained-apps/outputs/gotomeeting/windows.json
  • ee/maintained-apps/outputs/grammarly-desktop/darwin.json
  • ee/maintained-apps/outputs/granola/windows.json
  • ee/maintained-apps/outputs/grepwin/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jdk-11/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jdk-17/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jdk-21/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jdk-8/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jre-11/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jre-17/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jre-21/windows.json
  • ee/maintained-apps/outputs/ibm-semeru-jre-8/windows.json
  • ee/maintained-apps/outputs/imageglass/windows.json
  • ee/maintained-apps/outputs/imhex/windows.json
  • ee/maintained-apps/outputs/inkscape/windows.json
  • ee/maintained-apps/outputs/ironpython/windows.json
  • ee/maintained-apps/outputs/jami/windows.json
  • ee/maintained-apps/outputs/keepassxc/windows.json
  • ee/maintained-apps/outputs/lapce/windows.json
  • ee/maintained-apps/outputs/lastpass/windows.json
  • ee/maintained-apps/outputs/libreoffice/windows.json
  • ee/maintained-apps/outputs/mattermost/windows.json
  • ee/maintained-apps/outputs/microsoft-edge/windows.json
  • ee/maintained-apps/outputs/mixxx/windows.json
  • ee/maintained-apps/outputs/mongodb-compass/windows.json
  • ee/maintained-apps/outputs/mysqlworkbench/windows.json
  • ee/maintained-apps/outputs/naps2/windows.json
  • ee/maintained-apps/outputs/nessus-agent/windows.json
  • ee/maintained-apps/outputs/nextcloud/windows.json
  • ee/maintained-apps/outputs/nodejs/windows.json
  • ee/maintained-apps/outputs/openvpn-connect/windows.json
  • ee/maintained-apps/outputs/p4v/windows.json
  • ee/maintained-apps/outputs/pdfsam-basic/windows.json
  • ee/maintained-apps/outputs/powershell/windows.json
  • ee/maintained-apps/outputs/prisma-browser/windows.json
  • ee/maintained-apps/outputs/putty/windows.json
  • ee/maintained-apps/outputs/reflector/windows.json
  • ee/maintained-apps/outputs/remote-desktop-manager/windows.json
  • ee/maintained-apps/outputs/rider/darwin.json
  • ee/maintained-apps/outputs/royal-tsx/windows.json
  • ee/maintained-apps/outputs/shapr3d/darwin.json
  • ee/maintained-apps/outputs/sharefile/windows.json
  • ee/maintained-apps/outputs/snagit/windows.json
  • ee/maintained-apps/outputs/sonicwall-netextender/windows.json
  • ee/maintained-apps/outputs/sourcetree/windows.json
  • ee/maintained-apps/outputs/tailscale/windows.json
  • ee/maintained-apps/outputs/textexpander/windows.json
  • ee/maintained-apps/outputs/tightvnc/windows.json
  • ee/maintained-apps/outputs/topaz-gigapixel-ai/windows.json
  • ee/maintained-apps/outputs/topaz-photo-ai/windows.json
  • ee/maintained-apps/outputs/tortoisegit/windows.json
  • ee/maintained-apps/outputs/tower/windows.json
  • ee/maintained-apps/outputs/transmission/windows.json
  • ee/maintained-apps/outputs/twingate/windows.json
  • ee/maintained-apps/outputs/ultimaker-cura/windows.json
  • ee/maintained-apps/outputs/vlc/windows.json
  • ee/maintained-apps/outputs/wave/windows.json
  • ee/maintained-apps/outputs/weasis/windows.json
  • ee/maintained-apps/outputs/webex/windows.json
  • ee/maintained-apps/outputs/windirstat/windows.json
  • ee/maintained-apps/outputs/winlogbeat/windows.json
  • ee/maintained-apps/outputs/wireshark/windows.json
  • ee/maintained-apps/outputs/wrike/windows.json
  • ee/maintained-apps/outputs/yarn/windows.json
  • ee/maintained-apps/outputs/yubico-authenticator/windows.json
  • ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json
  • ee/maintained-apps/outputs/zoom/windows.json
  • ee/maintained-apps/outputs/zulip/windows.json

],
"refs": {
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate matching files =="
git ls-files | rg '^(ee/maintained-apps/outputs/.+)?/windows\.json$' | head -100

echo "== occurrences of 22e48c46 and script shape =="
rg -n '"22e48c46"' ee/maintained-apps/outputs/*/windows.json || true

echo "== Windows.json candidate contents =="
for f in \
  ee/maintained-apps/outputs/advanced-installer/windows.json \
  ee/maintained-apps/outputs/aircall/windows.json \
  ee/maintained-apps/outputs/airparrot/windows.json \
  ee/maintained-apps/outputs/alacritty/windows.json \
  ee/maintained-apps/outputs/elgato-control-center/windows.json \
  ee/maintained-apps/outputs/elgato-stream-deck/windows.json \
  ee/maintained-apps/outputs/emclient/windows.json \
  ee/maintained-apps/outputs/endnote/windows.json \
  ee/maintained-apps/outputs/epic-games/windows.json \
  ee/maintained-apps/outputs/filebeat/windows.json \
  ee/maintained-apps/outputs/flexwhere/windows.json; do
  if [ -f "$f" ]; then
    echo "--- $f"
    cat -n "$f"
  fi
done

echo "== PowerShell availability and Start-Process ErrorAction behavior probe =="
if command -v pwsh >/dev/null 2>&1; then
  pwsh -NoProfile -NoLogo -Command '
    Add-Type -AssemblyName Microsoft.VisualBasic
    $path = "C:\NonExistentInstaller.msi"
    $tmp = Get-Item "$env:TEMP"
    $log = "$tmp/fleet-install-repro-badpath.log"

    # Probe non-existing executable path, not a real failed command line
    $p = Start-Process pwsh -PassThru -Wait -ArgumentList "-NoProfile", "-Command", "process", "xyz" 2>$null
    if ($PSBoundParameters.ContainsKey( \"ErrorAction\" )) {
      Write-Output HAS_PARAM
    } else {
      Write-Output NO_PARAM
    }
    Write-Output "ExitCode=$( $null -eq $p ? \"null\" : $p.ExitCode )"
    Write-Output "StandardError=$( $null -eq $p.StandardError ? \"null\" : $p.StandardError.ReadToEnd() )
  '
else
  echo "pwsh unavailable"
fi

Repository: fleetdm/fleet

Length of output: 5581


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== 22e48c46 windows.json occurrences =="
rg -n '"22e48c46"|\$successCodes |ErrorAction Stop|Get-Content $logFile|Start-Process msiexec' ee/maintained-apps/outputs/*/windows.json || true

echo "== exact files from reviewed list =="
python3 - <<'PY'
from pathlib import Path
for p in [
  "ee/maintained-apps/outputs/advanced-installer/windows.json",
  "ee/maintained-apps/outputs/aircall/windows.json",
  "ee/maintained-apps/outputs/airparrot/windows.json",
  "ee/maintained-apps/outputs/alacritty/windows.json",
  "ee/maintained-apps/outputs/elgato-control-center/windows.json",
  "ee/maintained-apps/outputs/elgato-stream-deck/windows.json",
  "ee/maintained-apps/outputs/emclient/windows.json",
  "ee/maintained-apps/outputs/endnote/windows.json",
  "ee/maintained-apps/outputs/epic-games/windows.json",
  "ee/maintained-apps/outputs/filebeat/windows.json",
  "ee/maintained-apps/outputs/flexwhere/windows.json",
]:
    path=Path(p)
    print(f"--- {p} exists={path.exists()} lines={sum(1 for _ in path.open()) if path.exists() else None}")
    if path.exists():
        for i,line in enumerate(path.read_text(errors="replace").splitlines(),1):
            if i in (18,19,20,21,22):
                print(f"{i: {line}")
PY

echo "== PowerShell behavior probe =="
if command -v pwsh >/dev/null 2>&1; then
  pwsh -NoProfile -NoLogo -Command '
    $caught = $false
    try {
      $tmp = Get-Item "$env:TEMP"
      $log = "$tmp/fleet-install-repro-badpath.log"
      $proc = Start-Process pwsh -PassThru -Wait -ArgumentList "-NoProfile", "-Command", "process", "xyz" 2>$null
      Write-Output "No-start-exception"
      Write-Output "ExitCode=$($null -eq $proc ? "null" : $proc.ExitCode)"
    } catch {
      $caught = $true
      Write-Output "Caught=$($_.FullyQualifiedErrorId)"
      Write-Output "TargetObject=$($_.TargetObject.GetType().FullName)"
      Write-Output "HResult=$($_.Exception.HResult)"
    }
    Write-Output "Caught=$caught"
  '
else
  echo "pwsh unavailable"
fi

echo "== Start-Process docs in local repository? =="
rg -n "ErrorAction Stop|Start-Process" ee/maintained-apps/outputs/advanced-installer/windows.json ee/maintained-apps/outputs/aircall/windows.json ee/maintained-apps/outputs/airparrot/windows.json ee/maintained-apps/outputs/alacritty/windows.json ee/maintained-apps/outputs/elgato-control-center/windows.json ee/maintained-apps/outputs/elgato-stream-deck/windows.json ee/maintained-apps/outputs/emclient/windows.json ee/maintained-apps/outputs/endnote/windows.json ee/maintained-apps/outputs/epic-games/windows.json ee/maintained-apps/outputs/filebeat/windows.json ee/maintained-apps/outputs/flexwhere/windows.json || true

Repository: fleetdm/fleet

Length of output: 50370


🌐 Web query:

PowerShell Start-Process nonexistent path ErrorAction Stop catches exception target object type ProcessExitCodeException

💡 Result:

In PowerShell, the -ErrorAction Stop common parameter does not reliably catch errors—such as a nonexistent path—when using the Start-Process cmdlet, because Start-Process is a cmdlet that wraps external process creation rather than executing a native PowerShell command [1]. Key points regarding this behavior: 1. CMDLET VS. EXTERNAL COMMANDS: The -ErrorAction parameter is designed for PowerShell cmdlets [1]. While Start-Process is a cmdlet, the actual execution of the target file is performed by the underlying operating system (via.NET's System.Diagnostics.Process) [2][3]. If the target executable is not found, the resulting error is often an InvalidOperationException or Win32Exception thrown by the.NET layer, which may not always be intercepted by PowerShell's try/catch mechanism in the way expected for standard cmdlets [1][4][2]. 2. NONEXISTENT PATH ERRORS: When Start-Process fails to locate an executable (e.g., due to an incorrect path or if the file is not in the system PATH), it frequently outputs an error message to the console instead of throwing a terminating error that can be caught [4][5]. In many environments, it produces an InvalidOperationException [4][5][3]. 3. PROCESS EXIT CODE ISSUES: You mentioned a ProcessExitCodeException. This is not a standard exception thrown by PowerShell's Start-Process cmdlet itself. It is a custom exception type often defined in third-party libraries (such as Azure Pipelines agent code) to specifically handle non-zero exit codes after a process completes [6]. Recommended Workarounds: * MANUAL VALIDATION: To handle potential errors robustly, verify the existence of the file before calling Start-Process using the Test-Path cmdlet: if (Test-Path -Path $MyExecutablePath) { Start-Process -FilePath $MyExecutablePath } else { Write-Error "File not found." } * CHECKING EXIT CODES: If you need to detect failures after the process has started (rather than file-not-found issues), do not rely on -ErrorAction Stop. Instead, if using -PassThru, you can inspect the ExitCode property of the returned process object after it has exited (ensure you access the.Handle property first if you encounter null values due to known issues with -NoNewWindow) [7][8][9]. * DIRECT.NET EXECUTION: For more granular control over exception handling, you can bypass Start-Process and use the System.Diagnostics.Process class directly in PowerShell: $p = [System.Diagnostics.Process]::Start($FileName) $p.WaitForExit [2][7]

Citations:


Handle MSI launch failures outside Start-Process’s built-in errors.

-ErrorAction Stop does not cover all Start-Process msiexec.exe failures. Use Test-Path "${env:INSTALLER_PATH}" before launching, handle a missing log, and set $ProcessExitCodesNonZeroExitAction = "Error" or use direct [System.Diagnostics.Process]::Start(...) if non-zero exit codes need to fail safely. Apply the same guard to each embedded 22e48c46 script.

📍 Affects 11 files
  • ee/maintained-apps/outputs/advanced-installer/windows.json#L20-L20 (this comment)
  • ee/maintained-apps/outputs/aircall/windows.json#L19-L19
  • ee/maintained-apps/outputs/airparrot/windows.json#L21-L21
  • ee/maintained-apps/outputs/alacritty/windows.json#L20-L20
  • ee/maintained-apps/outputs/elgato-control-center/windows.json#L20-L20
  • ee/maintained-apps/outputs/elgato-stream-deck/windows.json#L20-L20
  • ee/maintained-apps/outputs/emclient/windows.json#L21-L21
  • ee/maintained-apps/outputs/endnote/windows.json#L20-L20
  • ee/maintained-apps/outputs/epic-games/windows.json#L20-L20
  • ee/maintained-apps/outputs/filebeat/windows.json#L20-L20
  • ee/maintained-apps/outputs/flexwhere/windows.json#L20-L20
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/advanced-installer/windows.json` at line 20,
Update the embedded MSI installation script around Start-Process,
$installProcess, and $logFile to validate $env:INSTALLER_PATH with Test-Path
before launching, configure non-zero process exit handling safely, and verify
the log exists before Get-Content; preserve the existing $successCodes behavior
and catch launch failures with a non-zero exit. Apply the same changes in
ee/maintained-apps/outputs/advanced-installer/windows.json:20-20,
ee/maintained-apps/outputs/aircall/windows.json:19-19,
ee/maintained-apps/outputs/airparrot/windows.json:21-21,
ee/maintained-apps/outputs/alacritty/windows.json:20-20,
ee/maintained-apps/outputs/elgato-control-center/windows.json:20-20,
ee/maintained-apps/outputs/elgato-stream-deck/windows.json:20-20,
ee/maintained-apps/outputs/emclient/windows.json:21-21,
ee/maintained-apps/outputs/endnote/windows.json:20-20,
ee/maintained-apps/outputs/epic-games/windows.json:20-20,
ee/maintained-apps/outputs/filebeat/windows.json:20-20, and
ee/maintained-apps/outputs/flexwhere/windows.json:20-20.

],
"refs": {
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

files=(
  "ee/maintained-apps/outputs/aws-sam-cli/windows.json"
  "ee/maintained-apps/outputs/aws-vpn-client/windows.json"
  "ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json"
  "ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json"
  "ee/maintained-apps/outputs/azure-functions-core-tools/windows.json"
  "ee/maintained-apps/outputs/ironpython/windows.json"
  "ee/maintained-apps/outputs/jami/windows.json"
  "ee/maintained-apps/outputs/keepassxc/windows.json"
  "ee/maintained-apps/outputs/lapce/windows.json"
  "ee/maintained-apps/outputs/lastpass/windows.json"
  "ee/maintained-apps/outputs/libreoffice/windows.json"
  "ee/maintained-apps/outputs/mattermost/windows.json"
)

printf 'PowerShell availability: '
if command -v pwsh >/dev/null 2>&1; then
  pwsh -NoProfile -Command '$PSVersionTable.PSVersion.ToString(); Exit 0'
else
  echo "pwsh unavailable"
fi

printf '\nMatching scripts:\n'
for f in "${files[@]}"; do
  printf '\n--- %s ---\n' "$f"
  if [ -f "$f" ]; then
    rg -n '"[0-9a-f]{8}":|Start-Process|Get-Content|ExitCode|ErrorAction|ErrorActionPreference|ALLUSERS' "$f" -C 2
  else
    echo "missing"
  fi
done

printf '\nPowerShell behavioral probe (if pwsh available):\n'
if command -v pwsh >/dev/null 2>&1; then
  pwsh -NoProfile -Command '
    $caught = $false
    try {
      Set-StrictMode -Version 3.0
      $installProcess = Start-Process -PassThru -FilePath nonexistent-msiexec.exe -ArgumentList "-help"
      Write-Host "no-start-process-error"
    } catch {
      $caught = $true
      Write-Host ("caught:" + $_.CategoryInfo.Category.ToString())
    }
    Write-Host ("caught-flag:" + $caught)
  '
else
  echo "skipped"
fi

Repository: fleetdm/fleet

Length of output: 23312


🌐 Web query:

Microsoft PowerShell error handling non-terminating error catch Start-Process -ErrorAction Stop

💡 Result:

In PowerShell, a try/catch block only catches terminating errors [1][2]. Many cmdlets, including Start-Process and Stop-Process, often generate non-terminating errors by default [1][3]. When a non-terminating error occurs, the pipeline continues, and the catch block is bypassed [4][1]. To handle these as terminating errors so that they can be caught by a catch block, you must explicitly escalate the error to a terminating one [4]. 1. Use -ErrorAction Stop: The most reliable way to force a command to trigger a catch block is to add -ErrorAction Stop to the cmdlet [4]. try { Start-Process -FilePath "nonexistent.exe" -ErrorAction Stop } catch { Write-Error "Failed to start process: $($.Exception.Message)" } 2. Handling Start-Process Specifics: Start-Process often succeeds if it successfully launches the process, even if that process later fails internally [5]. If you need to detect failures within the launched process, do not rely on try/catch [5]. Instead, use the -PassThru and -Wait parameters to inspect the exit code [5][6]: $process = Start-Process -FilePath "yourscript.exe" -Wait -PassThru if ($process.ExitCode -ne 0) { # Handle the error logic here manually Write-Error "Process exited with error code $($process.ExitCode)" } 3. Handling Stop-Process: Similarly, Stop-Process may generate non-terminating errors (e.g., if a process is already gone or access is denied) [7]. Use -ErrorAction Stop if you need to catch these issues [4]: try { Stop-Process -Name "NonExistentProcess" -ErrorAction Stop } catch { Write-Warning "Could not stop process: $($.Exception.Message)" } Summary of key concepts: - Non-terminating errors: Reported by the cmdlet but allow the script to continue [8][1]. - Terminating errors: Stop the command (or script) and trigger catch blocks [1][2]. - Escalation: Use -ErrorAction Stop to convert a non-terminating error into a terminating one, allowing it to be handled by a try/catch block [4].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

if command -v pwsh >/dev/null 2>&1; then
  pwsh -NoProfile -Command '
    Set-StrictMode -Version 3.0

    $caught = $false
    try {
      $v = $null
      $proc = Start-Process -PassThru -FilePath nonexistent-msiexec.exe -ArgumentList "-help"
      $v = $proc.ExitCode
      Write-Host "no-start-process-error"
    } catch {
      $caught = $true
      Write-Host ("catch-category:" + $_.CategoryInfo.Category.ToString())
    }
    Write-Host ("caught-flag:" + $caught)
    Write-Host ("variable-null:" + ($null -eq $v))
    try {
      $x = $v.ExitCode
      Write-Host "exitcode-property-access-succeeded"
    } catch {
      Write-Host ("property-error-category:" + $_.CategoryInfo.Category.ToString())
    }

    $logFileName = "\uFEFFfleet-install-software.log"
    $gotContent = $false
    try {
      try {
        $gotContent = Get-Content -LiteralPath $logFileName -Tail 500 | Out-String
        Write-Host "get-content-succeeded"
      } catch {
        Write-Host ("get-content-capture-category:" + $_.CategoryInfo.Category.ToString())
        Write-Host ("exception-message:" + $_.Exception.Message)
        if ($_ -is [PSInvocationStopped]) {
          Write-Host "is-psinvocationstopped:true"
        } else {
          Write-Host "is-psinvocationstopped:false"
        }
      }
      Write-Host ("got-content-after-inner-catch:" + $gotContent)
    } catch {
      Write-Host ("outer-catch-saw:" + $_.CategoryInfo.Category.ToString())
      Write-Host ("caught-after-log-inner-catch:" + $caught)
    }
  '
else
  echo "pwsh unavailable"
fi

Repository: fleetdm/fleet

Length of output: 566


🌐 Web query:

Microsoft PowerShell Get-Content nonexistent file -ErrorAction SilentlyContinue output empty no error

💡 Result:

When you use Get-Content on a nonexistent file with -ErrorAction SilentlyContinue, PowerShell suppresses the error message that would otherwise be printed to the console [1]. Because the error is suppressed, the command effectively returns nothing (an empty output), and the script continues execution [1]. This behavior occurs because Get-Content generates a non-terminating error when it cannot locate a file [2][3]. The -ErrorAction SilentlyContinue parameter specifically instructs PowerShell to suppress non-terminating errors, preventing them from displaying in the console while allowing the script to proceed [2][1]. To verify the success of the operation when using SilentlyContinue, you can use the following approaches: 1. Check the automatic $? variable: This variable is set to $true if the previous command succeeded and $false if it failed [1]. $content = Get-Content -Path "nonexistent.txt" -ErrorAction SilentlyContinue if (-not $?) { Write-Host "File could not be read." } 2. Use the -ErrorVariable parameter: This captures any errors in a specified variable without outputting them to the console [3][1]. Get-Content -Path "nonexistent.txt" -ErrorAction SilentlyContinue -ErrorVariable myErrors if ($myErrors) { Write-Host "Errors occurred: $($myErrors.Count)" } 3. Use Test-Path: It is often best practice to explicitly check if a file exists before attempting to read it, which avoids the error entirely [4]. if (Test-Path -Path "nonexistent.txt") { Get-Content -Path "nonexistent.txt" } else { Write-Warning "File missing." } Note that -ErrorAction SilentlyContinue only affects non-terminating errors [2][1]. If you need to handle errors via a try/catch block, you must ensure the error is treated as a terminating error by using -ErrorAction Stop or by setting $ErrorActionPreference = 'Stop' [2][1][4].

Citations:


🌐 Web query:

PowerShell Get-Content nonexistent file no ErrorAction default behavior returns empty non-terminating error

💡 Result:

When you attempt to use Get-Content on a nonexistent file, the cmdlet produces a non-terminating error [1][2][3]. The default behavior in PowerShell is to write this error to the error stream (displaying it in the console) and then continue execution of the script or pipeline [1][2][4][3]. It does not return "empty" in the sense of suppressing the error, but rather outputs an error record while returning no content [1][2][3]. Because this is a non-terminating error, it cannot be caught by a standard try/catch block using default settings [1][2][3]. To handle this error programmatically with a catch block, you must escalate the error to a terminating error by setting the -ErrorAction parameter to Stop (e.g., Get-Content -Path "nonexistent.txt" -ErrorAction Stop) [2][5][4][3].

Citations:


Fix installer error handling in every referenced script.

Current Start-Process can fail while allowing the try block to continue. Then $installProcess remains unset and its non-terminating failure is not caught before the MSI exit-code comparison. Add -ErrorAction Stop to Start-Process, and handle Get-Content separately so missing logs do not change the installer result. This fixes the same issue in all referenced windows.json entries.

Proposed PowerShell adjustment
 try {
-  $installProcess = Start-Process msiexec.exe `
+  $installProcess = Start-Process msiexec.exe `
     -ArgumentList ... `
-    -PassThru -Verb RunAs -Wait
+    -PassThru -Verb RunAs -Wait -ErrorAction Stop

-  Get-Content $logFile -Tail 500
+  if (Test-Path -LiteralPath $logFile) {
+    Get-Content -LiteralPath $logFile -Tail 500 -ErrorAction Stop
+  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait -ErrorAction Stop\n\nif (Test-Path -LiteralPath $logFile) {\n Get-Content -LiteralPath $logFile -Tail 500 -ErrorAction Stop\n}\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
📍 Affects 12 files
  • ee/maintained-apps/outputs/aws-sam-cli/windows.json#L20-L20 (this comment)
  • ee/maintained-apps/outputs/aws-vpn-client/windows.json#L20-L20
  • ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json#L19-L19
  • ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json#L19-L19
  • ee/maintained-apps/outputs/azure-functions-core-tools/windows.json#L20-L20
  • ee/maintained-apps/outputs/ironpython/windows.json#L20-L20
  • ee/maintained-apps/outputs/jami/windows.json#L20-L20
  • ee/maintained-apps/outputs/keepassxc/windows.json#L20-L20
  • ee/maintained-apps/outputs/lapce/windows.json#L20-L20
  • ee/maintained-apps/outputs/lastpass/windows.json#L20-L20
  • ee/maintained-apps/outputs/libreoffice/windows.json#L20-L20
  • ee/maintained-apps/outputs/mattermost/windows.json#L21-L21
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/aws-sam-cli/windows.json` at line 20, Update the
installer PowerShell script in every referenced windows.json entry:
ee/maintained-apps/outputs/aws-sam-cli/windows.json:20-20,
ee/maintained-apps/outputs/aws-vpn-client/windows.json:20-20,
ee/maintained-apps/outputs/azul-zulu-25-jdk/windows.json:19-19,
ee/maintained-apps/outputs/azul-zulu-25-jre/windows.json:19-19,
ee/maintained-apps/outputs/azure-functions-core-tools/windows.json:20-20,
ee/maintained-apps/outputs/ironpython/windows.json:20-20,
ee/maintained-apps/outputs/jami/windows.json:20-20,
ee/maintained-apps/outputs/keepassxc/windows.json:20-20,
ee/maintained-apps/outputs/lapce/windows.json:20-20,
ee/maintained-apps/outputs/lastpass/windows.json:20-20,
ee/maintained-apps/outputs/libreoffice/windows.json:20-20, and
ee/maintained-apps/outputs/mattermost/windows.json:21-21. Add ErrorAction Stop
to Start-Process so failures reach the catch block, and handle Get-Content
separately so a missing log does not alter the MSI exit-code result.

],
"refs": {
"29a9338f": "# BlueJ ships a per-user WiX MSI. Fleet runs installs elevated (SYSTEM), so we\n# pass ALLUSERS=2 — the same switch winget uses — which resolves to a per-machine\n# install (into %ProgramFiles%\\BlueJ) when run elevated.\n\n$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\" ALLUSERS=2\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"85459eac": "# BlueJ ships a per-user WiX MSI. Fleet runs installs elevated (SYSTEM), so we\n# pass ALLUSERS=2 — the same switch winget uses — which resolves to a per-machine\n# install (into %ProgramFiles%\\BlueJ) when run elevated.\n\n$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\" ALLUSERS=2\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

manifest='ee/maintained-apps/outputs/bluej/windows.json'
jq -r '.refs["85459eac"]' "$manifest" |
  rg -n 'Exit .*ExitCode|successCodes|3010|1641'

Repository: fleetdm/fleet

Length of output: 184


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

manifest='ee/maintained-apps/outputs/bluej/windows.json'

echo "BlueJ 85459eac exit handling:"
jq -r '.refs["85459eac"]' "$manifest" | nl -ba | sed -n '1,80p'

echo
echo "Locate shared exit-code handling references:"
rg -n "successCodes|1641|3010|WIN32_ERROR|ExitCode|exit.*3010|exit.*1641" ee/maintained-apps/outputs -g '*.json' -g '*.ps1' | head -n 120

echo
echo "Candidate files around shared MSI handling:"
fd -e json -e ps1 . ee/maintained-apps/outputs | grep -Ei 'msi|windows|manifest|common|shared' | head -n 80

Repository: fleetdm/fleet

Length of output: 221


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

manifest='ee/maintained-apps/outputs/bluej/windows.json'

echo "BlueJ 85459eac exit handling:"
jq -r '.refs["85459eac"]' "$manifest" | awk '{ printf "%7d\t%s\n", NR, $0 }' | sed -n '1,120p'

echo
echo "Locate shared exit-code handling references:"
rg -n "successCodes|1641|3010|WIN32_ERROR|ExitCode|exit.*3010|exit.*1641" ee/maintained-apps/outputs -g '*.json' -g '*.ps1' | head -n 120

echo
echo "Candidate files around shared MSI handling:"
fd -e json -e ps1 . ee/maintained-apps/outputs 2>/dev/null | grep -Ei 'msi|windows|manifest|common|shared|windows\.json|powershell' | head -n 120

Repository: fleetdm/fleet

Length of output: 50372


🌐 Web query:

Microsoft MSI return codes ERROR_SUCCESS_REBOOT_REQUIRED 3010 ERROR_SUCCESS_REBOOT_INITIATED 1641 documentation

💡 Result:

In Windows Installer (MSI) operations, both ERROR_SUCCESS_REBOOT_REQUIRED and ERROR_SUCCESS_REBOOT_INITIATED are classified as success codes, indicating that the installation process itself finished successfully while requiring or triggering a system restart to finalize changes [1][2][3]. ERROR_SUCCESS_REBOOT_REQUIRED (3010) This code indicates that the installation completed successfully, but a system restart is required to fully complete the installation operation [1][2]. It does not indicate an error and should be treated as a success signal by deployment tools [1][3]. This code does not apply to installations that trigger a ForceReboot action [1][3]. ERROR_SUCCESS_REBOOT_INITIATED (1641) This code indicates that the installer has proactively initiated a system restart [2][3]. Like 3010, this is considered a success status [1][2][4]. Because system reboots are asynchronous, the restart may occur before this return code is received by the calling process [5]. These return values are specifically defined for Windows Installer functions such as MsiExec.exe and InstMsi.exe [1][3]. Deployment systems and scripts should be configured to recognize both 3010 and 1641 as successful completion states to avoid reporting false installation failures [4].

Citations:


Handle Windows Installer success reboot codes in BlueJ’s MSI script.

BlueJ installs through msiexec.exe, but the script exits $installProcess.ExitCode without mapping 3010 or 1641 to success. Treat those codes as completed installs so Fleet does not report a successful MSI restart as a failure.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/bluej/windows.json` at line 19, Update the BlueJ
MSI script’s exit handling after Start-Process completes so exit codes 3010 and
1641 are treated as successful installs, while preserving the existing behavior
for code 0 and returning failures unchanged. Use the existing
$installProcess.ExitCode flow before the catch block.

"34a531d4": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts('{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"34a531d4": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts('{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== target file context =="
sed -n '1,80p' ee/maintained-apps/outputs/cinc/windows.json 2>/dev/null || true

echo
echo "== related uninstall scripts and win-msi exit-code patterns =="
rg -n "Success[Code]|exit[[:space:]]+codes|3010|1641|ERROR_SUCCESS_REBOOT|WinExitCode|MSI exit|msiexec --quiet|/quiet|WindowsInstaller" ee/maintained-apps/outputs -S

echo
echo "== git diff stat/name for maintained-apps =="
git diff --stat HEAD -- ee/maintained-apps/outputs || true
git diff -- ee/maintained-apps/outputs | sed -n '1,220p' || true

Repository: fleetdm/fleet

Length of output: 50370


🌐 Web query:

Microsoft msiexec exit code 3010 1641 reboot required initiated documentation

💡 Result:

When running a Microsoft Windows Installer (msiexec.exe) package, exit codes 1641 and 3010 both indicate that the installation process completed successfully but required a system restart to finish the configuration [1][2]. The primary difference between the two codes is whether the installer triggered the restart itself: Exit Code 1641 (ERROR_SUCCESS_REBOOT_INITIATED): This code indicates that the installer has already initiated a system restart [1][3]. Exit Code 3010 (ERROR_SUCCESS_REBOOT_REQUIRED): This code indicates that a restart is required to complete the installation, but the installer has not initiated the restart itself [1][2][4]. This is common in silent or unattended installations where automatic reboots are suppressed [4][5]. Both codes are considered success codes by the Windows Installer [1][3]. In deployment environments such as System Center Configuration Manager (SCCM) or other software management tools, administrators often configure the deployment to treat both 1641 and 3010 as successful outcomes rather than failures, allowing the system to handle the pending reboot according to the organization's maintenance policy [2][4]. Because these reboots may be asynchronous, the actual system restart might occur before the installer process returns the exit code to the calling environment [6]. Note that these codes do not apply to installs where a ForceReboot action has been executed, as those scenarios use different internal handling [1][6].

Citations:


Treat MSI reboot-required exit codes as success in the Cinc uninstaller.

msiexec returns 3010 or 1641 after a successful uninstall that needs rebooting. The script currently exits with the uninstall code, so Fleet can report this as failure. Add 0, 3010, and 1641 to the success-code check used for msiexec /x.

Proposed fix
+# MSI exit codes that indicate success.
+$successCodes = @(0, 3010, 1641)
+
-    if ($process.ExitCode -ne 0) {
+    if ($successCodes -notcontains $process.ExitCode) {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"34a531d4": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts('{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n"
"34a531d4": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{9870C512-DF2C-43D9-8C28-7ACD60ABBE27}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/cinc/windows.json` at line 20, Update the msiexec
result check in the uninstaller loop to treat exit codes 0, 3010, and 1641 as
successful. Keep logging and returning unexpected nonzero exit codes through the
existing failure path, while allowing reboot-required codes to complete with the
final success exit.

"refs": {
"6b837909": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{EA58A259-5C39-43E8-9183-EAAB09293D3F}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

while IFS= read -r file; do
  script="$(jq -er '.refs["22e48c46"]' "$file")"
  grep -Fq -- '-ErrorAction Stop' <<<"$script" || {
    printf 'Missing explicit error handling: %s\n' "$file" >&2
    exit 1
  }
done < <(rg -l '"install_script_ref": "22e48c46"' ee/maintained-apps/outputs -g 'windows.json')

Repository: fleetdm/fleet

Length of output: 204


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'Repo files matching windows.json in outputs:\n'
git ls-files 'ee/maintained-apps/outputs/*/windows.json' | sed -n '1,120p'

printf '\nOccurrences of 22e48c46:\n'
rg -n '"22e48c46"|install_script_ref|ExitCode|Start-Process msiexec' ee/maintained-apps/outputs/*/windows.json || true

printf '\nInspect first matched manifest:\n'
python3 - <<'PY'
import json, pathlib, re
for p in sorted(pathlib.Path('ee/maintained-apps/outputs').glob('*/windows.json')):
    txt = p.read_text()
    if '"22e48c46"' in txt:
        print(f'--- {p} ---')
        data = json.loads(txt)
        script = data.get('refs', {}).get('22e48c46')
        if script:
            print('refs 22e48c46 contains -ErrorAction Stop:', '-ErrorAction Stop' in script)
            print('cmdlet error action occurrences:')
            for line in script.splitlines():
                if 'ErrorAction' in line or 'Start-Process' in line or 'Get-Content' in line:
                    print(line.strip())
PY

printf '\nMaintained apps cmd source candidates:\n'
git ls-files | rg 'maintained-apps|cmd/maintained-apps|scripts|generate|installer|windows' | sed -n '1,240p'

Repository: fleetdm/fleet

Length of output: 50370


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'Count of 22e48c46 refs:\n'
rg -c '"install_script_ref": "22e48c46"' ee/maintained-apps/outputs/*/windows.json || true

printf '\nManifests with unhandled cmdlet error actions in ref 22e48c46:\n'
python3 - <<'PY'
import json, pathlib
for p in sorted(pathlib.Path('ee/maintained-apps/outputs').glob('*/windows.json')):
    txt = p.read_text(errors='replace')
    if '"install_script_ref": "22e48c46"' not in txt:
        continue
    data = json.loads(txt)
    script = data.get('refs', {}).get('22e48c46', '')
    start = script.find('try')
    body = script[start:] if start != -1 else script
    unchecked = []
    missing_erroraction_stop = []
    for i, line in enumerate(body.splitlines(), 1):
        if any(cmd in line for cmd in ['Start-Process', 'Get-Content']):
            if '-ErrorAction Stop' not in line:
                missing_erroraction_stop.append((i, line.strip()))
            unchecked.append((i, line.strip()))
    if unchecked:
        print(f'--- {p} ---')
        for i, line in unchecked:
            print(f'cmdlet line: {line}')
        for i, line in missing_erroraction_stop:
            print(f'no -ErrorAction Stop: {line}')
PY

printf '\nTop 12 cmd source candidates:\n'
git ls-files | rg '(^go.mod$|cmd/maintained-apps|maintained-apps.*\.go|scripts/|fleetctl|\.ts$|\.js$)' | sed -n '1,240p'

printf '\nReferences to 22e48c46 in tracked source (excluding pre-existing output manifests):\n'
rg -n '"22e48c46"|Start-Process.*msiexec|Get-Content.*fleet-install-software' --glob '!ee/maintained-apps/outputs/*' || true

Repository: fleetdm/fleet

Length of output: 50369


🌐 Web query:

Microsoft Learn PowerShell about_error_handling catch block non-terminating error cmdlet ErrorAction Stop

💡 Result:

In PowerShell, try/catch blocks are specifically designed to handle terminating errors, which include both statement-terminating and script-terminating errors [1][2]. Non-terminating errors, such as those typically generated by Write-Error or certain cmdlet failures (like Get-Item on a missing file), do not trigger catch blocks by default and will instead simply write to the error stream while execution continues [2][3]. Using the -ErrorAction Stop parameter (or setting the $ErrorActionPreference variable to 'Stop') is the standard way to elevate a non-terminating error into a terminating error so it can be handled within a catch block [4][2][5]. When -ErrorAction Stop is applied: 1. The engine intercepts the non-terminating error generated by the cmdlet [4]. 2. It wraps the original error in an ActionPreferenceStopException and converts it into a terminating error [4][5]. 3. Because it is now a terminating error, the PowerShell engine will look for a catch block or trap statement in the current or parent scopes [4][1]. 4. Inside the catch block, you can access the original error information via the $_ automatic variable, specifically by accessing $_.Exception.ErrorRecord [4]. Important distinctions to keep in mind: - Scope: In non-advanced scripts, -ErrorAction Stop can escalate errors to script-terminating, causing the entire script to halt unless caught. In advanced functions, it generally acts as a statement-terminating error [4]. - Pipeline Behavior: While -ErrorAction Stop makes an error catchable, it does not necessarily stop the entire execution of a script if the error occurs within a pipeline or a specific statement; it only stops the execution of that specific command or statement [2][6]. To stop the entire script after catching an error, you must explicitly use a command like throw or exit within your catch block [6][7]. - Catching specific errors: You can use typed catch blocks (e.g., catch [System.Management.Automation.ItemNotFoundException]) to handle specific error types escalated by -ErrorAction Stop, allowing for more granular error management [7].

Citations:


Fix the shared 22e48c46 MSI installer script once, then regenerate every affected manifest.

This installer reference is used by over 180 Windows manifests, but Start-Process and Get-Content can emit non-terminating cmdlet errors without -ErrorAction Stop. Add -ErrorAction Stop to both commands so launch or log-read failures enter catch instead of continuing and exiting on an unreliable $installProcess.ExitCode.

Proposed shared fix
-  -PassThru -Verb RunAs -Wait
+  -PassThru -Verb RunAs -Wait -ErrorAction Stop

-Get-Content $logFile -Tail 500
+Get-Content -Path $logFile -Tail 500 -ErrorAction Stop
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv `\"${logFile}`\" /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait -ErrorAction Stop\n\nGet-Content -Path $logFile -Tail 500 -ErrorAction Stop\n\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
📍 Affects 10 files
  • ee/maintained-apps/outputs/devolutions-workspace/windows.json#L20-L20 (this comment)
  • ee/maintained-apps/outputs/devpod/windows.json#L20-L20
  • ee/maintained-apps/outputs/dngrep/windows.json#L20-L20
  • ee/maintained-apps/outputs/draftable-desktop/windows.json#L20-L20
  • ee/maintained-apps/outputs/drofus/windows.json#L20-L20
  • ee/maintained-apps/outputs/dropbox/windows.json#L19-L19
  • ee/maintained-apps/outputs/druva-insync/windows.json#L20-L20
  • ee/maintained-apps/outputs/duo-desktop/windows.json#L21-L21
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json#L21-L21
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json#L20-L20
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/devolutions-workspace/windows.json` at line 20,
Update the shared MSI installer script to add ErrorAction Stop to both
Start-Process and Get-Content, ensuring launch and log-read failures enter
catch; then regenerate the manifests. Apply the regenerated change at
ee/maintained-apps/outputs/devolutions-workspace/windows.json:20,
devpod/windows.json:20, dngrep/windows.json:20,
draftable-desktop/windows.json:20, drofus/windows.json:20,
dropbox/windows.json:19, druva-insync/windows.json:20,
duo-desktop/windows.json:21, eclipse-temurin-jdk-11/windows.json:21, and
eclipse-temurin-jdk-17/windows.json:20.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants