添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

This should be really simple, but I cannot make it work. I'm new to the PowerShell so my mistake is probably obvious. I'm trying to ask a user for an input using a while loop, and prompting the user to try again if what was entered was not numeric. In bash it would look like this:

while read -p "What is the first number? " first; do
if [[ $first = *[[:digit:]]* ]]; then
break   # if $first is numeric, break loop
echo "$first is not numeric. Enter a numeric value. "

Here's what I have for the PS:

While ($first = (Read-Host "What is the first number?") -as [double]) {
if ($first -eq $null) { Write-Host "Please enter a numeric value." }
else { break }

In the example above, I can break the loop fine when a number is entered, but I can't see the Write-Host statement if I type a string.

the while test is run before the loop is run. that means your if test will prevent the "then" result from ever running. [grin] – Lee_Dailey Nov 19 '18 at 1:23

Looking at the While line:

While ($first = (Read-Host "What is the first number?") -as [double]) 

This will only enter/continue the loop body when the input is already a double, because it rolls up the cast to double as part of the loop condition. You want to enter the loop body on any input, and only check if it's a double afterwards. At least, that's what the bash code does:

While ($first = (Read-Host "What is the first number?")) {
    if ( ($first -as [double]) -eq $null) { Write-Host "Please enter a numeric value." }
    else { break }

Or you could continue using the cast as part of the condition by negating the whole expression, and thus avoid the need for the awkward break:

While (-not ($first = (Read-Host "What is the first number?") -as [double])) {
    Write-Host "Please enter a numeric value." 
                Perfect. I think it should be [double] and not double in the first solution though.
                    – Hubert Léveillé Gauvin
                Nov 19 '18 at 11:37
        

You could use this to keep prompting for a valid number input as you are looking for.

"Please enter a numeric value." | Out-Host $first = (Read-Host "What is the first number?") -as [double] } While($null -eq $first)

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.2.7.36004