I received a lot of interest in my Invoke-Flasher script. One comment I received on Twitter was for a way to use it interactively in a script. In essence, he wanted a flashing Read-Host so I took my original concept and tweaked it until I came up with a Read-Host alternative I simply call Read-Host2. This function will only work in the PowerShell console, NOT the PowerShell ISE.
ManageEngine ADManager Plus - Download Free Trial
Exclusive offer on ADManager Plus for US and UK regions. Claim now!
#requires -version 3.0 Function Read-Host2 { <# .Synopsis An alternative to Read-Host .Description This is an alternative to Read-Host which works almost the same as the original cmdlet. You can use this to prompt the user for input. They can either enter text or have the text converted to a secure string. The only difference is that the prompt will display in a flashing colors until you start typing. This command will NOT work properly in the PowerShell ISE. .Parameter Prompt The text to be displayed. A colon will be appended. .Parameter AsSecureString The entered text will be treated as a secure string. This parameter has an alias of 'ss'. .Parameter UseForeground Flash the text color instead of the background. This parameter has aliases of 'fg' and 'foreground'. .Example PS C:\> $user = Read-Host2 "Enter a username" -color DarkGreen Prompt for user name using a dark green background .Example PS C:\> $pass = Read-Host2 "Enter a password" -color darkred -foreground -asSecureString Prompt for a password using DarkRed as the foreground color. .Example PS C:\> $s={ $l = get-eventlog -list ; Read-host2 "Press enter to continue" ; $l} PS C:\> &$s Press enter to continue : Max(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 30,829 Application 20,480 0 OverwriteAsNeeded 0 HardwareEvents 512 7 OverwriteOlder 0 Internet Explorer 20,480 0 OverwriteAsNeeded 0 Key Management Service 20,480 0 OverwriteAsNeeded 12 Lenovo-Customer Feedback 128 0 OverwriteAsNeeded 455 OAlerts 512 7 OverwriteOlder 0 PreEmptive 20,480 0 OverwriteAsNeeded 32,013 Security 20,480 0 OverwriteAsNeeded 26,475 System 15,360 0 OverwriteAsNeeded 17,715 Windows PowerShell This is an example of how you might use the command in a script. The prompt will keep flashing until you press Enter. .Notes Last Updated: August 18, 2014 Version : 0.9 Learn more: PowerShell in Depth: An Administrator's Guide (http://www.manning.com/jones2/) PowerShell Deep Dives (http://manning.com/hicks/) Learn PowerShell in a Month of Lunches (http://manning.com/jones3/) Learn PowerShell Toolmaking in a Month of Lunches (http://manning.com/jones4/) **************************************************************** * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED * * THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF * * YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, * * DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. * **************************************************************** .Link https://jdhitsolutions.com/blog/2014/08/more-flashing-fun .Link Read-Host ConvertTo-SecureString #> [cmdletbinding()] Param( [Parameter(Position=0,Mandatory,HelpMessage="Enter a prompt message without a colon (:)")] [string]$Prompt, [Alias('ss')] [switch]$AsSecureString, [System.ConsoleColor]$Color = "Red", [Alias("fg","Foreground")] [switch]$UseForeground ) #this will be the array of entered characters $text = @() #save current background and foreground colors $bg = $host.ui.RawUI.BackgroundColor $fg = $host.ui.RawUI.ForegroundColor #set a variable to be used in a While loop $Running = $True #set a variable to determine if the user is typing something $Typing = $False #get current cursor position $Coordinate = $host.ui.RawUI.CursorPosition $msg = "`r$Prompt : " While ($Running) { if (-Not $Typing) { #don't toggle or pause if the user is typing if ($UseForeground) { if ($host.ui.RawUI.ForegroundColor -eq $fg) { $host.ui.RawUI.ForegroundColor = $color } else { $host.ui.RawUI.ForegroundColor = $fg } } else { if ($host.ui.RawUI.BackgroundColor -eq $bg) { $host.ui.RawUI.BackgroundColor = $color } else { $host.ui.RawUI.BackgroundColor = $bg } } Start-Sleep -Milliseconds 350 } #if not typing #set the cursor position $host.ui.rawui.CursorPosition=$Coordinate #write the message on a new line Write-Host $msg #see if a key has been pushed if ($host.ui.RawUi.KeyAvailable) { #user is typing $Typing = $True #filter out shift key $key = $host.ui.RawUI.ReadKey("NoEcho,IncludeKeyDown") Switch ($key.virtualKeyCode) { 13 { $Running = $False ; Break} 16 { #Shift key so don't do anything Break } Default{ #add the key to the array $text+=$key #display the entered text if ($AsSecureString) { #mask the character if asking for a secure string $out = "*" } else { $out = $key.character } #append the character to the prompt $msg+= $out } } #switch } #if key available } #while #reset the original background color $host.ui.RawUI.BackgroundColor = $bg $host.ui.RawUI.ForegroundColor = $fg #write the input to the pipeline #removing any leading or trailing spaces $data = (-join $text.Character).Trim() #convert to SecureString if specified if ($AsSecureString) { ConvertTo-SecureString -String $data -AsPlainText -Force } else { #write the read data to the pipeline $data } } #end function
The main tweak I made was to collect all the typed keys until Enter is pressed. I have a Switch construct to also eliminate the Shift key. The assumption is that you are writing text so this should be the only non alphanumeric key you would use. The message prompt will keep flashing until you start typing. I also emulated echoing text to the screen, including password masking if you use AsSecureString. The last change is a new parameter to allow you to flash the foreground color instead of the background color. There are several examples in the comment-based help.
I hope you'll let me know what you think.
Works great! You really adds some Spark’s to your console scripts