我正在尝试编写一个位于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
答案 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"
}
}
}
}