简短说明
介绍使用脚本创建 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