使用params将值传递给while循环中的开关

时间:2016-12-27 00:14:51

标签: powershell

我正在尝试编写一个位于while循环中的脚本。目标是通过键入test来启动该功能。然后,您可以键入“s”并将值传递给while循环中的开关。

PS > test
PS > s hello
hello passed

这是我到目前为止所做的:

function test{
[cmdletbinding()]
param(
[Parameter(ParameterSetName="s", ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][string[]]$s
)
while($true){
$x = Read-Host
switch($x){
s {
Write-Host $s "passed"
break
}
default {"False"}
}
}
}

请告诉我逻辑关闭的地方。

目前我可以将x设置为等于s,这就是我得到的。

PS > test
PS > s
passed

1 个答案:

答案 0 :(得分:3)

这里有几个问题。

$s参数不会执行任何操作,因为您实际上并未将参数参数传递给test

break中的switch语句完全是多余的,因为switch不支持PowerShell中的语句落实。假设您想要突破while循环,您必须label the loop and break statement(参见下面的示例)

最后,由于您希望while循环的每次迭代中的输入由两部分组成(在您的示例中为s然后hello),因此您需要将$x分成两部分:

$first,$second = $x -split '\s',2

然后是switch($x),所以我们最终得到的结果是:

function test
{
    [CmdletBinding()]
    param()

    # label the while loop "outer"
    :outer while($true){
        $x = Read-Host

        # split $x into two parts
        $first,$second = $x -split '\s',2

        # switch evaluating the first part
        switch($first){
            s {
                # output second part of input
                Write-Host $second "passed"

                # explicitly break out of the "outer" loop
                break outer
            }
            default {
                Write-Host "False"
            }
        }
    }
}