首页 > 解决方案 > PowerShell - `begin` 块和外面的任何东西有什么区别?

问题描述

如果我写一个这样的函数:

function a {
    begin {
        do-something
    }
}

它不和这个做同样的事情吗?

function a {
    do-something
}

有什么区别begin

标签: powershell

解决方案


看看这些是否提供了任何启发:

关于语言关键字

管道对象到函数

您可以使用 Begin、Process 和 End 关键字来控制函数如何处理来自管道的输入。

Windows PowerShell Cookbook,第 3 版,作者:Lee Holmes

与面向管道的函数一样,Foreach-Object cmdlet 允许您定义要在循环开始之前、循环期间和循环完成之后执行的命令:

"a","b","c" | Foreach-Object `
-Begin { "Starting"; $counter = 0 } `
-Process { "Processing $_"; $counter++ } `
-End { "Finishing: $counter" }

Starting
Processing a
Processing b
Processing c
Finishing: 3

了解 PowerShell 开始、处理和结束块

高级 PowerShell 函数:从开始到结束

还有一件事:

他说,根据 Don Jones 的一个 PowerShell mvp,只有在使用管道输入运行命令时才使用 PROCESS 块。在这种情况下,对象一次绑定到一个输入参数,并执行 PROCESS。如果您只是直接运行脚本,即没有管道输入,则 PROCESS 将被忽略。

因此,如果我们查看实现细节的定义目标,我们有:

开始

该块用于为函数提供可选的一次性预处理。PowerShell 运行时针对管道中函数的每个实例使用此块中的代码一次。

过程

该块用于为函数提供逐个记录的处理。根据函数的输入,这个块可能会被使用多次,或者根本不被使用。例如,如果函数是管道中的第一个命令,则进程块将被使用一次。如果函数不是管道中的第一个命令,则 Process 块将用于函数从管道接收的每个输入。如果没有管道输入,则不使用 Process 块。

过滤器是一个函数的简写表示,它的主体完全由一个进程块组成。

如果函数参数设置为接受管道输入,则必须定义此块。如果未定义此块并且参数接受来自管道的输入,则函数将丢失通过管道传递给函数的值。

此外,如果函数/cmdlet 支持确认请求(-SupportsShouldProcess 参数设置为 $True),则必须从 Process 块中调用 ShouldProcess 方法。

结尾

此块用于为函数提供可选的一次性后处理


推荐阅读