Search code examples
validationpowershelluser-inputcase-sensitive

Validating user entry matches mixed case requirements


I am trying to figure out how to test for mixed case or change the user input to mixed case.

Currently my code consists of:

$Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'

However, I need to validate that the user entered in the exact case, and if they didn't change the case to the correct case. I have reviewed so many different questions on here and other websites, but none seem to really talk about validating mixed case in a way I can understand.

  1. Validate User Entry
  2. Regex to match mixed case words
  3. Validating String User Entry
  4. How to check if a string is all upper case (lower case) characters?
  5. Learn Powershell | Achieve More
  6. How To Validate Parameters in PowerShell
  7. $args in powershell

I am not asking anyone to write code for me. I am asking for some sample code that I can gain an understanding on how to validate and change the entries.


Solution

  • PowerShell performs case-insensitive comparisons by default, so to answer the first part of your question you need to do a case-sensitive comparison which is -ceq.

    $Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'
    ($Type -ceq 'MY' -or  $Type -ceq 'OLD' -or  $Type -ceq 'NEWTest' -or  $Type -ceq 'Old_Tests')
    

    Although a simpler solution to that is to use case-sensitive contains -ccontains:

    ('MY', 'OLD', 'NEWTest', 'Old_Tests' -ccontains $Type)
    

    Here's one way you might correct the case:

    $Type = Read-Host 'Enter MY, OLD, NEWTest, Old_Tests'
    
    If ('MY', 'OLD', 'NEWTest', 'Old_Tests'  -cnotcontains $Type){
    
        If ('MY', 'OLD', 'NEWTest', 'Old_Tests' -contains $Type){
            $TextInfo = (Get-Culture).TextInfo
    
            $Type = Switch ($Type) {
                {$_ -in 'MY','OLD'} { $Type.ToUpper() }
                'NEWTest'           { $Type.Substring(0,4).ToUpper() + $Type.Substring(4,3).ToLower() }
                'Old_Tests'         { $TextInfo.ToTitleCase($Type) }
            }  
        } Else {
            Write-Warning 'You didnt enter one of: MY, OLD, NEWTest, Old_Tests'
        }
    }
    
    Write-Output $Type
    

    Explanation:

    First we test if the case is correct for the four permitted words (-cnotcontains Case Sensitive Not Contains), if it is we do nothing. If the case is not correct, then we test the text is correct (without caring about case sensitivity -contains).

    If the text is correct then we use Switch statement to deal with the different scenarios that we want to adapt the case for:

    The first switch test matches the first two words and simply uppercases them with the ToUpper() string method.

    The second switch test uses the string method SubString to get a subset of the string starting from the first character (0) and taking 4 characters in length. We uppercase this with ToUpper then we add on the next 3 characters of the string, starting at the 4th character, which we force in to lower case with ToLower().

    The final switch test we handle with a .NET method taken from the get-culture cmdlet which allows us to Title Case a string (make the first letter of each word uppercase).

    If the inputted text didn't match one of the options we use write-warning (may require PowerShell 4 or above, if you don't have this change it to write-host) to print a warning to the console.

    Finally whatever was entered we send to stdout with Write-Output.