powershell - PowerShell - `begin` 块和外面的任何东西有什么区别?
问题描述
如果我写一个这样的函数:
function a {
begin {
do-something
}
}
它不和这个做同样的事情吗?
function a {
do-something
}
有什么区别begin
?
解决方案
看看这些是否提供了任何启发:
您可以使用 Begin、Process 和 End 关键字来控制函数如何处理来自管道的输入。
与面向管道的函数一样,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
还有一件事:
他说,根据 Don Jones 的一个 PowerShell mvp,只有在使用管道输入运行命令时才使用 PROCESS 块。在这种情况下,对象一次绑定到一个输入参数,并执行 PROCESS。如果您只是直接运行脚本,即没有管道输入,则 PROCESS 将被忽略。
因此,如果我们查看实现细节的定义目标,我们有:
开始
该块用于为函数提供可选的一次性预处理。PowerShell 运行时针对管道中函数的每个实例使用此块中的代码一次。
过程
该块用于为函数提供逐个记录的处理。根据函数的输入,这个块可能会被使用多次,或者根本不被使用。例如,如果函数是管道中的第一个命令,则进程块将被使用一次。如果函数不是管道中的第一个命令,则 Process 块将用于函数从管道接收的每个输入。如果没有管道输入,则不使用 Process 块。
过滤器是一个函数的简写表示,它的主体完全由一个进程块组成。
如果函数参数设置为接受管道输入,则必须定义此块。如果未定义此块并且参数接受来自管道的输入,则函数将丢失通过管道传递给函数的值。
此外,如果函数/cmdlet 支持确认请求(-SupportsShouldProcess 参数设置为 $True),则必须从 Process 块中调用 ShouldProcess 方法。
结尾
此块用于为函数提供可选的一次性后处理 。
推荐阅读
- java - 提交表单时,提交日期/时间的 Spring 为空
- java - 如何在 Apache Flink 中注册 java.util.List 类型
- qt - 强制 qt 不在模型上调用 data() 函数
- zap - 在詹金斯自由风格工作中未使用 ZAP 生成测试报告
- xcode - 为什么 Xcode 大小几乎翻了一番?
- python - ValueError:使用序列设置数组元素。在 session.run
- wordpress - 更改网址后无法打开 WordPress 网站
- html - 删除 Chrome 中的输入历史记录
- javascript - HERE 地图 API 是否有放大/缩小事件?
- css - 如何缩放 SVG 以适应其中的动态内容