mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
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:
@@ -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): $_"
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user