Feat: Add option to ignore non-zero application exit codes

Introduces a new feature allowing application installations to succeed regardless of their exit code. This is useful for installers that may return non-standard exit codes which should be treated as successful.

Changes include:
- A new checkbox in the UI to enable this option for an application.
- Updates to the application installation script to handle the new setting.
- Modifications to save and load this setting in the application list.
This commit is contained in:
rbalsleyMSFT
2025-08-04 17:21:34 -07:00
parent 03c8127bd3
commit ac7ef119e0
4 changed files with 47 additions and 13 deletions
@@ -15,8 +15,10 @@ function Invoke-Process {
[bool]$Wait = $true, [bool]$Wait = $true,
[Parameter()] [Parameter()]
[string[]]$AdditionalSuccessCodes [string[]]$AdditionalSuccessCodes,
[Parameter()]
[bool]$IgnoreNonZeroExitCodes = $false
) )
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
@@ -51,8 +53,12 @@ function Invoke-Process {
$exitCode = $p.ExitCode $exitCode = $p.ExitCode
# An exit code of 0 is always a success # An exit code of 0 is always a success
if ($exitCode -ne 0) { if ($exitCode -ne 0) {
# If IgnoreNonZeroExitCodes is true, treat any non-zero exit code as a success
if ($IgnoreNonZeroExitCodes) {
Write-Host "Ignoring non-zero exit code $exitCode because IgnoreNonZeroExitCodes is set to true."
}
# Check if the non-zero exit code is in the list of additional success codes # Check if the non-zero exit code is in the list of additional success codes
if ($null -eq $AdditionalSuccessCodes -or $exitCode -notin $AdditionalSuccessCodes) { elseif ($null -eq $AdditionalSuccessCodes -or $exitCode -notin $AdditionalSuccessCodes) {
if ($cmdError) { if ($cmdError) {
throw $cmdError.Trim() throw $cmdError.Trim()
} }
@@ -152,8 +158,14 @@ function Install-Applications {
Write-Host "Additional success exit codes for $($app.Name): $($additionalSuccessCodes -join ', ')" Write-Host "Additional success exit codes for $($app.Name): $($additionalSuccessCodes -join ', ')"
} }
# Check for IgnoreNonZeroExitCodes
$ignoreNonZeroExitCodes = $false
if ($app.PSObject.Properties['IgnoreNonZeroExitCodes'] -and $app.IgnoreNonZeroExitCodes -is [bool]) {
$ignoreNonZeroExitCodes = $app.IgnoreNonZeroExitCodes
}
Write-Host "Running command: $($app.CommandLine) $($argumentsToPass -join ' ')" Write-Host "Running command: $($app.CommandLine) $($argumentsToPass -join ' ')"
$result = Invoke-Process -FilePath $($app.CommandLine) -ArgumentList $argumentsToPass -AdditionalSuccessCodes $additionalSuccessCodes $result = Invoke-Process -FilePath $($app.CommandLine) -ArgumentList $argumentsToPass -AdditionalSuccessCodes $additionalSuccessCodes -IgnoreNonZeroExitCodes $ignoreNonZeroExitCodes
Write-Host "$($app.Name) exited with exit code: $($result.ExitCode)`r`n" Write-Host "$($app.Name) exited with exit code: $($result.ExitCode)`r`n"
} catch { } catch {
Write-Error "Error occurred while installing $($app.Name): $_" Write-Error "Error occurred while installing $($app.Name): $_"
+4
View File
@@ -377,6 +377,9 @@
<TextBlock Text="Additional Exit Codes:" Margin="0,0,0,5"/> <TextBlock Text="Additional Exit Codes:" Margin="0,0,0,5"/>
<TextBox x:Name="txtAppAdditionalExitCodes" Margin="0,0,0,10" ToolTip="Enter a comma-separated list of additional success exit codes."/> <TextBox x:Name="txtAppAdditionalExitCodes" Margin="0,0,0,10" ToolTip="Enter a comma-separated list of additional success exit codes."/>
<!-- Ignore Non-Zero Exit Codes Checkbox -->
<CheckBox x:Name="chkIgnoreExitCodes" Content="Ignore all non-zero exit codes" Margin="0,0,0,10" ToolTip="If checked, any non-zero exit code will be considered a success."/>
<!-- Add Application Button --> <!-- Add Application Button -->
<Button x:Name="btnAddApplication" Content="Add Application" Width="120" HorizontalAlignment="Left" Margin="0,10,0,10" Padding="10,5" ToolTip="Add the application to the list"/> <Button x:Name="btnAddApplication" Content="Add Application" Width="120" HorizontalAlignment="Left" Margin="0,10,0,10" Padding="10,5" ToolTip="Add the application to the list"/>
@@ -397,6 +400,7 @@
<GridViewColumn Header="Arguments" DisplayMemberBinding="{Binding Arguments}" Width="200"/> <GridViewColumn Header="Arguments" DisplayMemberBinding="{Binding Arguments}" Width="200"/>
<GridViewColumn Header="Source" DisplayMemberBinding="{Binding Source}" Width="150"/> <GridViewColumn Header="Source" DisplayMemberBinding="{Binding Source}" Width="150"/>
<GridViewColumn Header="Exit Codes" DisplayMemberBinding="{Binding AdditionalExitCodes}" Width="100"/> <GridViewColumn Header="Exit Codes" DisplayMemberBinding="{Binding AdditionalExitCodes}" Width="100"/>
<GridViewColumn Header="Ignore Exit Codes" DisplayMemberBinding="{Binding IgnoreExitCodes}" Width="120"/>
<GridViewColumn Header="Copy Status" DisplayMemberBinding="{Binding CopyStatus}" Width="150"/> <GridViewColumn Header="Copy Status" DisplayMemberBinding="{Binding CopyStatus}" Width="150"/>
<GridViewColumn Header="Action" Width="85"> <GridViewColumn Header="Action" Width="85">
<GridViewColumn.CellTemplate> <GridViewColumn.CellTemplate>
@@ -56,6 +56,7 @@ function Add-BYOApplication {
$arguments = $State.Controls.txtAppArguments.Text $arguments = $State.Controls.txtAppArguments.Text
$source = $State.Controls.txtAppSource.Text $source = $State.Controls.txtAppSource.Text
$additionalExitCodes = $State.Controls.txtAppAdditionalExitCodes.Text $additionalExitCodes = $State.Controls.txtAppAdditionalExitCodes.Text
$ignoreNonZeroExitCodes = $State.Controls.chkIgnoreExitCodes.IsChecked
if ([string]::IsNullOrWhiteSpace($name) -or [string]::IsNullOrWhiteSpace($commandLine)) { if ([string]::IsNullOrWhiteSpace($name) -or [string]::IsNullOrWhiteSpace($commandLine)) {
[System.Windows.MessageBox]::Show("Please fill in all fields (Name and Command Line)", "Missing Information", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show("Please fill in all fields (Name and Command Line)", "Missing Information", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
@@ -72,13 +73,24 @@ function Add-BYOApplication {
if ($listView.Items.Count -gt 0) { if ($listView.Items.Count -gt 0) {
$priority = ($listView.Items | Measure-Object -Property Priority -Maximum).Maximum + 1 $priority = ($listView.Items | Measure-Object -Property Priority -Maximum).Maximum + 1
} }
$application = [PSCustomObject]@{ Priority = $priority; Name = $name; CommandLine = $commandLine; Arguments = $arguments; Source = $source; AdditionalExitCodes = $additionalExitCodes; CopyStatus = "" } $application = [PSCustomObject]@{
Priority = $priority
Name = $name
CommandLine = $commandLine
Arguments = $arguments
Source = $source
AdditionalExitCodes = $additionalExitCodes
IgnoreNonZeroExitCodes = $ignoreNonZeroExitCodes
IgnoreExitCodes = if ($ignoreNonZeroExitCodes) { "Yes" } else { "No" }
CopyStatus = ""
}
$listView.Items.Add($application) $listView.Items.Add($application)
$State.Controls.txtAppName.Text = "" $State.Controls.txtAppName.Text = ""
$State.Controls.txtAppCommandLine.Text = "" $State.Controls.txtAppCommandLine.Text = ""
$State.Controls.txtAppArguments.Text = "" $State.Controls.txtAppArguments.Text = ""
$State.Controls.txtAppSource.Text = "" $State.Controls.txtAppSource.Text = ""
$State.Controls.txtAppAdditionalExitCodes.Text = "" $State.Controls.txtAppAdditionalExitCodes.Text = ""
$State.Controls.chkIgnoreExitCodes.IsChecked = $false
Update-CopyButtonState -State $State Update-CopyButtonState -State $State
} }
@@ -162,8 +174,10 @@ function Save-BYOApplicationList {
try { try {
# Ensure items are sorted by current priority before saving # Ensure items are sorted by current priority before saving
# Exclude CopyStatus when saving and ensure Priority is an integer # Exclude UI-only properties (CopyStatus, IgnoreExitCodes) and ensure Priority is an integer
$applications = $listView.Items | Sort-Object Priority | Select-Object @{N = 'Priority'; E = { [int]$_.Priority } }, Name, CommandLine, Arguments, Source, AdditionalExitCodes $propertiesToSave = 'Priority', 'Name', 'CommandLine', 'Arguments', 'Source', 'AdditionalExitCodes', 'IgnoreNonZeroExitCodes'
$applications = $listView.Items | Sort-Object Priority | Select-Object @{N = 'Priority'; E = { [int]$_.Priority } }, Name, CommandLine, Arguments, Source, AdditionalExitCodes, IgnoreNonZeroExitCodes
$applications | ConvertTo-Json -Depth 5 | Set-Content -Path $Path -Force -Encoding UTF8 $applications | ConvertTo-Json -Depth 5 | Set-Content -Path $Path -Force -Encoding UTF8
[System.Windows.MessageBox]::Show("Applications saved successfully to `"$Path`".", "Save Applications", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information) [System.Windows.MessageBox]::Show("Applications saved successfully to `"$Path`".", "Save Applications", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
} }
@@ -195,14 +209,17 @@ function Import-BYOApplicationList {
# Add items and sort by priority from the file # Add items and sort by priority from the file
$sortedApps = $applications | Sort-Object Priority $sortedApps = $applications | Sort-Object Priority
foreach ($app in $sortedApps) { foreach ($app in $sortedApps) {
$ignoreNonZero = if ($app.PSObject.Properties['IgnoreNonZeroExitCodes']) { $app.IgnoreNonZeroExitCodes } else { $false }
$appObject = [PSCustomObject]@{ $appObject = [PSCustomObject]@{
Priority = $app.Priority Priority = $app.Priority
Name = $app.Name Name = $app.Name
CommandLine = $app.CommandLine CommandLine = $app.CommandLine
Arguments = if ($app.PSObject.Properties['Arguments']) { $app.Arguments } else { "" } Arguments = if ($app.PSObject.Properties['Arguments']) { $app.Arguments } else { "" }
Source = $app.Source Source = $app.Source
AdditionalExitCodes = if ($app.PSObject.Properties['AdditionalExitCodes']) { $app.AdditionalExitCodes } else { "" } AdditionalExitCodes = if ($app.PSObject.Properties['AdditionalExitCodes']) { $app.AdditionalExitCodes } else { "" }
CopyStatus = "" IgnoreNonZeroExitCodes = $ignoreNonZero
IgnoreExitCodes = if ($ignoreNonZero) { "Yes" } else { "No" }
CopyStatus = ""
} }
$listView.Items.Add($appObject) $listView.Items.Add($appObject)
} }
@@ -90,6 +90,7 @@ function Initialize-UIControls {
$State.Controls.txtAppArguments = $window.FindName('txtAppArguments') $State.Controls.txtAppArguments = $window.FindName('txtAppArguments')
$State.Controls.txtAppSource = $window.FindName('txtAppSource') $State.Controls.txtAppSource = $window.FindName('txtAppSource')
$State.Controls.txtAppAdditionalExitCodes = $window.FindName('txtAppAdditionalExitCodes') $State.Controls.txtAppAdditionalExitCodes = $window.FindName('txtAppAdditionalExitCodes')
$State.Controls.chkIgnoreExitCodes = $window.FindName('chkIgnoreExitCodes')
$State.Controls.btnAddApplication = $window.FindName('btnAddApplication') $State.Controls.btnAddApplication = $window.FindName('btnAddApplication')
$State.Controls.btnSaveBYOApplications = $window.FindName('btnSaveBYOApplications') $State.Controls.btnSaveBYOApplications = $window.FindName('btnSaveBYOApplications')
$State.Controls.btnLoadBYOApplications = $window.FindName('btnLoadBYOApplications') $State.Controls.btnLoadBYOApplications = $window.FindName('btnLoadBYOApplications')