Read-host not passing variable?

227 views Asked by At

So I writing some code to run some patching on AWS, I have the following script snippet taken out of the whole thing for now.. I seem to be running into an issue with $PSBoundParameters.. (It's Friday & I've had a long week so I may just need to sleep on it) - but I can't seem to pass anything out of read-host...

param (
[Parameter(Mandatory = $true)][ValidateNotNullorEmpty()][string]$Prof,
[Parameter(Mandatory = $false)][ValidateNotNullorEmpty()][string]$Reminder,
[Parameter(Mandatory = $false)][ValidateNotNullorEmpty()][string]$AddToTGs,
[Parameter(Mandatory = $false)][ValidateNotNullorEmpty()][string]$PatchType,
[Parameter(Mandatory = $false)][ValidateNotNullorEmpty()][string]$Instance,
[Parameter(Mandatory = $false)][ValidateNotNullorEmpty()][string]$Environment
)

function PromptInstance {
    $Instance = Read-Host -Prompt "Please Specify the Instance"
    Write-Host "Using: $Instance" -ForegroundColor Cyan
}

function PromptEnvtoPatch {
    $Environment = Read-Host -Prompt "Please Specify the Environment (e.g. dev)"
    Write-Host "Using: $Environment" -ForegroundColor Cyan
}

function PromptReminder {
$title = "Calendar"
$message = "Do you want to Add an Outlook Reminder in 24 Hrs?"
$pA = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Adds an Outlook Reminder"
$pB = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Won''t add a reminder"
$options = [System.Management.Automation.Host.ChoiceDescription[]]($pA, $pB)
$CalResult = $host.ui.PromptForChoice($title, $message, $options, 0)

    switch ($CalResult)
    {
        0 {
            $global:CalRes = 1
            Write-Host "Reminder will be added.." -ForegroundColor Cyan
        }
        1 {
            $global:CalRes = 0
            Write-Host "No Reminder will be added.." -ForegroundColor Cyan
        } 
    }
}

function PromptAddToTGs {
    $title = "Re-Add to Target Groups"
    $message = "Do you want to have this script Automatically add the instances back into the Target Groups after Patching?"
    $pA = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Will ADD the instance back into Target Groups"
    $pB = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Will NOT add the instance back into Target Groups"
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($pA, $pB)
    $result = $host.ui.PromptForChoice($title, $message, $options, 1)
    
    switch ($result)
    {
        0 {
            $global:AddTGRes = 1
            Write-Host "Instances WILL be added back into Target Groups" -ForegroundColor Cyan
        }
        1 {
            $global:AddTGRes = 0
            Write-Host "Instances will NOT be added back into Target Groups" -ForegroundColor Cyan
        }
    }
}

function PromptPatchType {
    $title = "Patching Type"
    $message = "Do you want to Patch a Single Instance, or ALL Instances for a specific Team Env?"
    $pA = New-Object System.Management.Automation.Host.ChoiceDescription "&Instance", "Patches an Instance"
    $pB = New-Object System.Management.Automation.Host.ChoiceDescription "&ALL Instances for an Env", "Patches ALL Instances in a Team Env"
    $pQ = New-Object System.Management.Automation.Host.ChoiceDescription "&Quit", "Cancel/Exit"
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($pA, $pB, $pQ)
    $PatchResult = $host.ui.PromptForChoice($title, $message, $options, 0)
    
    switch ($PatchResult)
    {
        0 {
            $Instance = Read-Host "Please Specify the Instance Id"
        }
        1 {
            $Environment = Read-Host "Please Specify the Team (i.e. dev)"
        }
        2 {
            Write-Host "You Quitter!... :-)"
            Exit
        }
    }
}

function KickOffPatchingEnv {
    param ($Prof, $Reg, $Reminder, $AddToTGs, $PatchType, $Environment)
    Write-Host "Using the Following Options: (Profile:$Prof) (Region:$Reg) (Reminder:$Reminder) (AddToTGs:$AddToTGs) (PatchType:$PatchType) (Environment:$Environment)"
}

function KickOffPatchingInst {
    param ($Prof, $Reg, $Reminder, $AddToTGs, $PatchType, $Instance)
    Write-Host "Using the Following Options: (Profile:$Prof) (Region:$Reg) (Reminder:$Reminder) (AddToTGs:$AddToTGs) (PatchType:$PatchType) (Instance:$Instance)"
}

switch -wildcard ($Prof) {
    "*dev*"        { $Reg = "eu-west-1"; $Bucket = "s3-dev-bucket" }
    "*admin*"      { $Reg = "eu-west-1"; $Bucket = "s3-admin-bucket" }
    "*prod*"       { $Reg = "eu-west-1"; $Bucket = "s3-prod-bucket" }
    "*staging*"    { $Reg = "eu-west-1"; $Bucket = "s3-staging-bucket" }
}

if (!$PSBoundParameters['Reminder']) { PromptReminder }

if (!$PSBoundParameters['AddToTGs']) { PromptAddToTGs }

if ($PSBoundParameters['PatchType']) {
    if (($PatchType -eq "i") -or ($PatchType -eq "instance") -or ($PatchType -eq "I") -or ($PatchType -eq "Instance")) {
        if (!$PSBoundParameters['Instance']) { PromptInstance }
        KickOffPatchingInst $Prof $Reg $Reminder $AddToTGs $PatchType $Instance
    }
    if (($PatchType -eq "a") -or ($PatchType -eq "all") -or ($PatchType -eq "A") -or ($PatchType -eq "All")) {
        if (!$PSBoundParameters['Environment']) { PromptEnvtoPatch }
        KickOffPatchingEnv $Prof $Reg $Reminder $AddToTGs $PatchType $Environment
    }
} else { PromptPatchType }

If I use the parameters on the command line, it works fine..

PS C:\Users\myself\Desktop> .\test.ps1 -Prof dev -Reminder y -AddToTGs y -PatchType a -Environment dev
Using the Following Options: (Profile:dev) (Region:eu-west-1) (Reminder:y) (AddToTGs:y) (PatchType:a) (Environment:dev)

But if I omit an option, say for instance the Environment, I'm prompted for it, but the value is not displayed..

PS C:\Users\myself\Desktop> .\test.ps1 -Prof dev -Reminder y -AddToTGs y -PatchType a 
Please Specify the Environment (e.g. dev): dev
Using: dev
Using the Following Options: (Profile:dev) (Region:eu-west-1) (Reminder:y) (AddToTGs:y) (PatchType:a) (Environment:)

Environment is empty.... I've tried loads of different things such as setting global:Environment etc, but I always seem to be missing out whichever variable isn't specified in the command?

Maybe this isn't the best way to write this, but i've never used $PSBoundParameters before so this is my first time trying it out..

Can anyone see my glaring error here at all? TIA :)

1

There are 1 answers

0
Alex On

@Mathias R. Jessen answered this for me.

I put this in the function

function PromptProfile {
    $Prof = Read-Host -Prompt "Please Specify the Profile"
    $global:UserProf = $Prof
}

then changed code later on with the global variable, so I can use them