2017-09-06 12 views
2

は、$ForEach自動変数をオフに示す(以下)コードブロックが存在するが、それはまた、バッチ内のサブルーチンのような構文を有します。私は、このコードがどのように機能するのか、どのような言語構造が呼び出されているのかについてのドキュメントは見つけることができません。私はそれがPowerShell v5の追加だと信じていますが、リリースノートを読んでも私を助けませんでした。 :tokenLoop foreach ($token in $tokens)は何を表していますか? (少なくともバージョン2.0以降)のPowerShell バージョン3.0とアップ においてabout_Foreachの例:PowerShellのcmdサブルーチン構文? <a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-5.1&viewFallbackFrom=powershell-Microsoft.PowerShell.Core" rel="nofollow noreferrer">this about page</a>で

function Get-FunctionPosition { 
    [CmdletBinding()] 
    [OutputType('FunctionPosition')] 
    param(
    [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] 
    [ValidateNotNullOrEmpty()] 
    [Alias('PSPath')] 
    [System.String[]] 
    $Path 
) 

    process { 
    try { 
     $filesToProcess = if ($_ -is [System.IO.FileSystemInfo]) { 
     $_ 
     } 
     else { 
     Get-Item -Path $Path 
     } 
     foreach ($item in $filesToProcess) { 
     if ($item.PSIsContainer -or $item.Extension -notin @('.ps1', '.psm1')) { 
      continue 
     } 
     $tokens = $errors = $null 
     $ast = [System.Management.Automation.Language.Parser]::ParseFile($item.FullName, ([REF]$tokens), ([REF]$errors)) 
     if ($errors) { 
      Write-Warning "File '$($item.FullName)' has $($errors.Count) parser errors." 
     } 
     :tokenLoop foreach ($token in $tokens) { 
      if ($token.Kind -ne 'Function') { 
       continue 
      } 
      $position = $token.Extent.StartLineNumber 
      do { 
      if (-not $foreach.MoveNext()) { 
       break tokenLoop 
      } 
      $token = $foreach.Current 
      } until ($token.Kind -in @('Generic', 'Identifier')) 
      $functionPosition = [pscustomobject]@{ 
      Name  = $token.Text 
      LineNumber = $position 
      Path  = $item.FullName 
      } 
      Add-Member -InputObject $functionPosition -TypeName FunctionPosition -PassThru 
     } 
     } 
    } 
    catch { 
     throw 
    } 
    } 
} 
+3

while文の中breakに関連して説明されています。 [about_break](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_break?view=powershell-5.1)を参照してください。 –

+0

これは、使用するループのラベルですbreakステートメントこれが常にPowerShellの一部であったのか、特定のバージョン@JeffZeitlinを追加したのか分かりますか?私は、「これはXで追加されました」というのは、約ページに見つかりませんでした。 – TheIncorrigible1

+1

@ TheIncorrigible1ラベルは少なくともv 3.0以降でpsになっています(v3言語仕様で記述されています) –

答えて

4

、次の文タイプが任意に標識ある:

  • switch
  • foreach
  • for
  • do

、これは何を意味するのでしょうか?それはあなたのラベル付き文の本体内breakまたはcontinueステートメントに引数としてラベル名を指定し、ラベルで示されたステートメントに適用され、フロー制御を持つことができることを意味します。

この例で考えてみましょう:直接の親の文があるので、

foreach($Name in 'Alice','Bob','Charlie'){ 
    switch($Name.Length){ 
     {$_ -lt 4} { 
      # We don't have time for short names, go to the next person 
      continue 
     } 
     default { 
      Write-Host "$Name! What a beautiful name!" 
     } 
    } 

    Write-Host "Let's process $Name's data!" 
} 

あなたはBobの場合は、私たちcontinue以来、二回しか出現する「レッツプロセス[...]」の文字列を期待するかもしれない、しかしをa switch、実際にはforeachステートメントには適用されませんでした。私たちは、明示的に我々がforeachループではなく、switch文を続けていきたいと述べていることができれば、我々はそれを避けることができる今

、:

:outer_loop 
foreach($Name in 'Alice','Bob','Charlie'){ 
    switch($Name.Length){ 
     {$_ -lt 4} { 
      # We don't have time for short names, go to the next person 
      continue outer_loop 
     } 
     default { 
      Write-Host "$Name! What a beautiful name!" 
     } 
    } 

    Write-Host "Let's process $Name's data!" 
} 

continue文は、実際にはむしろスイッチよりもループを続けています。

あなたがループ構造を入れ子にしたときに非常に便利。


ラベルは簡単にあなたが2つの構築物を混合しているabout_Break help topic

+0

IIRCでは、ループラベルはv1以降PowerShellにありました。それらは確かv2で動作します。私はここでそれを確認するためのV1を持っていませんが。 – PetSerAl

関連する問題