You use begin
, process
, and end
当您的代码应该处理管道输入时会阻塞。这begin
块用于预处理,并在输入处理开始之前运行一次。这end
块用于后处理,并在输入处理完成后运行一次。如果您想在除end
块你定义它在begin
块(在中一遍又一遍地重新定义它process
块会浪费资源,即使你没有在begin
block).
[CmdletBinding()]
param(
[String]$Value
)
BEGIN {
Function f() {
param([String]$m)
Write-Host $m
}
f("Begin")
}
PROCESS {
f("Process:" + $Value)
}
END {
f("End")
}
引用自about_Functions https://technet.microsoft.com/en-us/library/hh847829.aspx:
将对象通过管道传递给函数
任何函数都可以从管道获取输入。您可以使用 Begin、Process 和 End 关键字控制函数如何处理来自管道的输入。以下示例语法显示了三个关键字:
function <name> {
begin {<statement list>}
process {<statement list>}
end {<statement list>}
}
Begin 语句列表仅在函数开始时运行一次。
Process 语句列表为管道中的每个对象运行一次。当 Process 块运行时,每个管道对象都会分配给 $_ 自动变量,一次分配一个管道对象。
函数接收到管道中的所有对象后,End 语句列表会运行一次。如果未使用 Begin、Process 或 End 关键字,则所有语句都将被视为 End 语句列表。
如果您的代码不处理管道输入,您可以删除begin
, process
, and end
完全阻塞并将所有内容放入脚本主体中:
[CmdletBinding()]
param(
[String]$Value
)
Function f() {
param([String]$m)
Write-Host $m
}
f("Begin")
f("Process:" + $Value)
f("End")
Edit:如果你想把定义f
在脚本末尾,您需要将其余代码定义为工作程序/主函数/其他函数,并在脚本末尾调用该函数,例如:
[CmdletBinding()]
param(
[String]$Value
)
function Main {
[CmdletBinding()]
param(
[String]$Param
)
BEGIN { f("Begin") }
PROCESS { f("Process:" + $Param) }
END { f("End") }
}
Function f() {
param([String]$m)
Write-Host $m
}
Main $Value