gpt4 book ai didi

powershell - about_Foreach 示例 : cmd subroutine syntax in PowerShell?

转载 作者:行者123 更新时间:2023-12-02 23:09:37 24 4
gpt4 key购买 nike

this about page ,有一个代码块(如下)展示了 $ForEach自动变量,但它也有类似批处理子程序的语法。我找不到关于这段代码如何运行或调用什么语言结构的文档。我相信这是 PowerShell v5 的补充,但阅读发行说明对我也没有帮助。 :tokenLoop foreach ($token in $tokens) 是什么意思代表?

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

最佳答案

在 PowerShell 3.0 版及更高版本中(至少从 2.0 版开始),可以选择标记以下语句类型:

  • switch
  • foreach
  • for
  • while
  • 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!"
    }

    您可能希望“Let's process [...]”字符串只出现两次,因为我们 continueBob 的情况下, 但由于直接父语句是 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语句实际上继续循环而不是切换。

    当您有嵌套循环结构时非常有用。

    标签与 break 一起简要讨论在 while about_Break help topic 中的声明

    关于powershell - about_Foreach 示例 : cmd subroutine syntax in PowerShell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077660/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com