Search code examples
powershellpowercli

Pause on failure, retry input from CSV


I have 2 sections of PowerShell code that exit the script on failure. After thinking about it I realized it would make more sense to pause on a failure and allow the admin time to remediate... then when the any key is paused, retry the same line in the CSV. Here's how it looks now:

#check tools status first
Write-Host ""
Write-Host "Checking VMware Tools Status before proceeding." -foreground green
Write-Host ""
foreach ($item in $vmlist) {
    $vmname = $item.vmname
    $ToolsStatus = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
    if ($ToolsStatus -eq $true) {
        Write-Host ""
        Write-Host "Tools is not installed or running on $vmname. Remediate on guest and restart the script" -foreground Yellow
        Write-Host "Script will continue to exit until tools is running on $vmname" -foreground yellow
        Write-Host ""
        exit
    } else {
        Write-Host ""
        Write-Host "Tools running on all VMs, script will continue" -foreground green
        Write-Host ""
    }
}

I know how to put the pause in $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'), but I have no idea to do the loop so it retries.

I'm using similar code elsewhere to validate that VMs are powered up so this will work in both sections.

EDIT: Here's the re-worked script. Would this work?

foreach ($item in $vmlist) {
    $vmname = $item.vmname
    do {
        $ToolsStatus = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
        if ($ToolsStatus) {
            Write-Host ""
            Write-Host "Tools is not installed or running on $vmname." -Foreground yellow
            Write-Host "Remediate VMware tools on $vmname and"
            Write-host "Press any key to retry..."
            $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
        }
    } until ($ToolsStatus -eq "PoweredOn")
    Write-Host "Tools running on $vmname, script will continue" -Foreground green
}

Solution

  • Add a nested do..while loop like this:

    foreach ($item in $vmlist) {
        $vmname = $item.vmname
        do {
            $ToolsMissing = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
            if ($ToolsMissing) {
                Write-Host "Tools is not installed or ..." -Foreground yellow
                $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
            }
        } while ($ToolsMissing)
    }
    
    Write-Host "Tools running on all VMs, script will continue" -Foreground green