有人能解释为什么例2不具有与例1相同的结果吗?我认为$a和$b2应该是一样的。$b2为空!我正在编写一个脚本,在示例2中使用该方法更好。
例1:
$a = Get-Content $some_text_file | Select-Object -Skip 1例2:
$b1 = Get-Content $some_text_file
$b2 = Select-Object -InputObject $b1 -Skip 1编辑:使用这种语法可以让我找到我需要做的事情。
$b1 = Get-Content $file
$b2 = $b1 | Select-Object -Skip 1发布于 2019-07-16 20:55:17
作为戴利笔记,这是预期的行为
有人能解释一下为什么
这与cmdlet在管道中的执行方式有关。
您可能知道,cmdlet的核心功能由三种方法组成:
*(高级函数中的begin/process/end块对应于这些块)。
BeginProcessing()和EndProcessing()总是精确地执行一次。ProcessRecord()执行多少次取决于它是否是管道中的第一个命令。
当cmdlet作为管道中的第一个元素出现时(即。左边没有|符号),ProcessRecord()只执行一次。
但是,当cmdlet从其管道中的上游命令接收输入时,对于通过管道进入的每个输入项,只运行一次ProcessRecord()。
考虑到这一点,请考虑Select-Object的简化版本
function Select-FakeObject {
param(
[Parameter(Mandatory, ValueFromPipeline)]
[object[]]$InputObject,
[Parameter()]
[int]$Skip = 0
)
begin {
$skipped = 0
}
process {
if($skipped -lt $Skip){
$skipped++
Write-Host "Skipping $InputObject"
}
else{
Write-Host "Selecting $InputObject"
Write-Output $InputObject
}
}
}现在,让我们使用这个虚拟函数来尝试这两种场景:
PS C:\> $a = 1,2,3
PS C:\> $b1 = $a |Select-FakeObject -Skip 1我们将看到PowerShell确实在每个输入项中调用process块一次
Skipping 1
Selecting 2
Selecting 3然而,如果我们像在第二个示例中那样传递对象:
PS C:\> $a = 1,2,3
PS C:\> $b2 = Select-FakeObject -Skip 1
Skipping 1 2 3现在我们看到,process块只在所有$a上执行一次,而不是单个项。
https://stackoverflow.com/questions/57064839
复制相似问题