powershell 继续执行Do-Until循环,直到有人输入1到9以外的值

xoshrz7s  于 2022-12-13  发布在  Shell
关注(0)|答案(3)|浏览(122)

问题是循环在第一次运行,但之后就停止了,我希望它继续这样,直到输入不是1到9.

do
{
    Show-Menu
    $selection = Read-Host "Please choose an option"
    switch ($selection)
    {
        '1' {
            Get-ChildItem
        } '2' {
            get-host|Select-Object
        } '3' {
            Get-NetIPConfiguration -Detailed
        } '4' {
            Get-NetRoute
        } '5' {
            Get-DnsClientCache
        } '6' {
            Get-Date -UFormat "%A %B/%d/%Y %T %Z"
        } '7' {
            Get-ItemProperty -Path HKLM:\
        } '8' {
            Stop-Service -Name Spooler -Force
            Restart-Service -Name Spooler -Force
        } '9' {
            Get-Service | Where-Object {$_.Status -eq "Running"}
        }
    }
    pause
}
until ($selection -ne 1..9)

我尝试了一个while循环,但它做了一个无限循环...

jdzmm42g

jdzmm42g1#

代码的唯一问题是-ne的使用:

until ($selection -ne 1..9)

代替-notin

until ($selection -notin 1..9)

-notin用于比较LHS(左侧)中的标量(单个值)是否不存在于RHS(右侧)上的集合中,当$selection不是19时,$selection -notin 1..9将返回$true
另一方面,-ne主要用于测试不等式,即使当LHS是一个集合时,它也可以用作过滤器,即:

'foo', 'bar', 'baz' -ne 'foo' # => 'bar', 'baz'

然而,正如之前所做的那样,您在测试单个值($selection)是否不等于数组(1..9),数组始终为$true,因此循环在第一次迭代后结束。

slsn1g29

slsn1g292#

这是另一种方法你可以做到这一点。

function Show-Menu
{
    Param()

    $selection = Read-Host 'Please choose an option'

    switch ($selection)
    {
        '1' {
            Get-ChildItem
        } '2' {
            get-host|Select-Object
        } '3' {
            Get-NetIPConfiguration -Detailed
        } '4' {
            Get-NetRoute
        } '5' {
            Get-DnsClientCache
        } '6' {
            Get-Date -UFormat '%A %B/%d/%Y %T %Z'
        } '7' {
            Get-ItemProperty -Path HKLM:\
        } '8' {
            Stop-Service -Name Spooler -Force
            Restart-Service -Name Spooler -Force
        } '9' {
            Get-Service | Where-Object {$_.Status -eq 'Running'}
        }
    }    
}
do {Show-Menu}
until ($selection -match '1-9')

# Results
<#
Please choose an option: 0
Please choose an option: 10
Please choose an option: 20
Please choose an option: 11
Please choose an option: 4

# Results
<#
ifIndex DestinationPrefix                              NextHop                                  RouteMetric ifMetric PolicyStore
...
#>

现在编写代码块的方式,即使使用“圣地亚哥Squarzon”提供的谨慎更正,它仍然会在数组中没有的数字上退出。
我的意思是

do
{
    Show-Menu
    $selection = Read-Host "Please choose an option"
    switch ($selection)
    {
        '1' {
            Get-ChildItem
        } '2' {
            get-host|Select-Object
        } '3' {
            Get-NetIPConfiguration -Detailed
        } '4' {
            Get-NetRoute
        } '5' {
            Get-DnsClientCache
        } '6' {
            Get-Date -UFormat "%A %B/%d/%Y %T %Z"
        } '7' {
            Get-ItemProperty -Path HKLM:\
        } '8' {
            Stop-Service -Name Spooler -Force
            Restart-Service -Name Spooler -Force
        } '9' {
            Get-Service | Where-Object {$_.Status -eq "Running"}
        }
    }
}
until ($selection -notin  1..9)
# Results
<#
until ($selection -notin  1..9)
Please choose an option: 0
Please choose an option: 10
# the do exited

until ($selection -notin  1..9)
Please choose an option: 11
Please choose an option: 110
# the do exited
#>

f45qwnt8

f45qwnt83#

是的,你需要一个While循环。Do本身什么也不做。
您还需要一个退出条件来中断循环。

switch(...)
{
<# switch options #>
default {break}
}

相关问题