about_Functions_Advanced

简短说明

介绍使用脚本创建 cmdlet 的高级函数。

详细说明

cmdlet 是参与 PowerShell 管道语义的单个命令。 这包括二进制 cmdlet、PowerShell 高级函数和 CDXML cmdlet。

高级函数允许创建编写为 PowerShell 函数的 cmdlet。 使用高级函数可以更轻松地创建 cmdlet,而无需编写和编译二进制 cmdlet。 二进制 cmdlet 是以 .NET 语言(如 C#)编写的 .NET 类。

高级函数使用 CmdletBinding 属性将其标识为类似 cmdlet 的函数。 CmdletBinding 属性类似于编译的 cmdlet 类中使用的 Cmdlet 属性,用于将类标识为 cmdlet。 有关此属性的详细信息,请参阅 about_Functions_CmdletBindingAttribute

函数的参数是在 param() 语句中声明的变量。 可以单独使用可选 [Parameter()] 属性,也可以与 [Alias()] 属性或任何参数验证属性结合使用。 有关如何声明参数的详细信息,请参阅 about_Functions_Advanced_Parameters

下面的示例演示一个函数,该函数接受名称,然后使用提供的名称打印问候语。 另请注意,此函数定义一个名称,该名称包括谓词(Send)和名词(Greeting)对,如已编译 cmdlet 的谓词-名词对。 但是,不需要函数具有谓词名词名称。

function Send-Greeting
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]$Name
    )

    process
    {
        Write-Host ("Hello " + $Name + "!")
    }
}

此函数在 process 块中执行工作,这等效于编译的 cmdlet 中使用的 ProcessingRecord 方法。 process 块和其他命名块在 about_Functions_Advanced_Methods中介绍。

高级函数与编译的 cmdlet 不同,方法如下:

  • 当字符串数组绑定到 布尔 参数时,高级函数参数绑定不会引发异常。
  • ValidateSet 属性和 ValidatePattern 属性无法传递命名参数。
  • 高级函数不能用于事务。

PIPELINESTOPTOKEN

从 PowerShell 7.6-preview.4 开始,$PSCmdlet 包括 PipelineStopToken 属性,允许访问绑定到 PowerShell 停止事件源的 CancellationToken。 当 PowerShell 管道收到停止请求时,将触发令牌。 将其与 .NET 方法一起使用,该方法接受 CancellationToken 重载,以在请求时退出该方法,而不是在方法返回之前等待。

在下面的示例中,函数调用 HttpClient.GetStringAsync,当网络速度缓慢或返回大量数据时,可能需要时间来响应。

function Invoke-CancelableWebRequest {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]
        $Url
    )

    $client = [System.Net.Http.HttpClient]::new()
    $client.GetStringAsync(
        $Url,
        $PSCmdlet.PipelineStopToken).GetAwaiter().GetResult()
}

Invoke-CancelableWebRequest -Url https://httpbin.org/delay/10
# Press ctrl+c to cancel

另请参阅