. "$PSScriptRoot/Config.ps1"; enum InstallerAction { Install Configure ConfigureUser } $null = New-Module { $userArgument = "name"; <# .SYNOPSIS Installs the software. #> function Install-Software { } <# .SYNOPSIS Configures the system for the software. #> function Set-SoftwareConfiguration { } <# .SYNOPSIS Configures a user for the software. .PARAMETER Name The name of the user to configure. #> function Set-SoftwareUserConfiguration { param( [Parameter(Mandatory = $true)] [string] $Name ) } function Start-SoftwareInstaller { param( [InstallerAction] $Action, [hashtable] $Arguments ) if (($null -eq $Action) -or ($action -eq ([InstallerAction]::Install))) { Install-Software @Arguments; } elseif ($action -eq ([InstallerAction]::Configure)) { Set-SoftwareConfiguration @Arguments; foreach ($user in Get-Users) { $Arguments.Add($userArgument, $user); Start-SoftwareInstaller -Action ([InstallerAction]::ConfigureUser) @Arguments; } } elseif ($action -eq ([InstallerAction]::ConfigureUser)) { if ((-not $Arguments.Contains($userArgument)) -or ($null -eq $Arguments[$userArgument])) { $Arguments.Add($userArgument, ($env:UserName)); } Set-SoftwareUserConfiguration @Arguments; } } }