2016-12-27 18 views
1

whileループ内にあるスクリプトを作成しようとしています。目標は、テストを入力して関数を起動することです。それで、 "s"とタイプして値をスイッチにwhileループで渡すことができます。whileループでパラメータを使用してスイッチに値を渡す

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"} 
} 
} 
} 

を私のロジックがオフになっているところ私に教えてください:ここでは

PS > test 
PS > s hello 
hello passed 

は、私がこれまで行っているものです。

現在、私はxとsを等しく設定できます。

PS > test 
PS > s 
passed 

答えて

3

ここにいくつかの問題があります。

testに実際にパラメータ引数を渡さないため、$sパラメータは何も保持しません。

switch内のbreakステートメントは、完全に冗長です。switchは、PowerShellのステートメントフォールスルーをサポートしていないためです。あなたがwhileループから抜け出すにしたいことを、あなたはlabel the loop and break statementする必要がありますと仮定すると、あなたが期待するのでwhileループの各反復での入力はあなたの例では(2つの部分で構成し、

最後(以下の例を参照) s、その後hello)、次の2つに$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" 
      } 
     } 
    } 
} 
関連する問題