首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Select-Object使用管道和-InputObject有不同的行为。

Select-Object使用管道和-InputObject有不同的行为。
EN

Stack Overflow用户
提问于 2019-07-16 20:16:55
回答 1查看 57关注 0票数 1

有人能解释为什么例2不具有与例1相同的结果吗?我认为$a和$b2应该是一样的。$b2为空!我正在编写一个脚本,在示例2中使用该方法更好。

例1:

代码语言:javascript
复制
$a = Get-Content $some_text_file | Select-Object -Skip 1

例2:

代码语言:javascript
复制
$b1 = Get-Content $some_text_file
$b2 = Select-Object -InputObject $b1 -Skip 1

编辑:使用这种语法可以让我找到我需要做的事情。

代码语言:javascript
复制
$b1 = Get-Content $file
$b2 = $b1 | Select-Object -Skip 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-16 20:55:17

作为戴利笔记,这是预期的行为

有人能解释一下为什么

这与cmdlet在管道中的执行方式有关。

您可能知道,cmdlet的核心功能由三种方法组成:

*(高级函数中的begin/process/end块对应于这些块)。

BeginProcessing()EndProcessing()总是精确地执行一次。ProcessRecord()执行多少次取决于它是否是管道中的第一个命令。

当cmdlet作为管道中的第一个元素出现时(即。左边没有|符号),ProcessRecord()只执行一次。

但是,当cmdlet从其管道中的上游命令接收输入时,对于通过管道进入的每个输入项,只运行一次ProcessRecord()

考虑到这一点,请考虑Select-Object的简化版本

代码语言:javascript
复制
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
        }
    }
}

现在,让我们使用这个虚拟函数来尝试这两种场景:

代码语言:javascript
复制
PS C:\> $a = 1,2,3
PS C:\> $b1 = $a |Select-FakeObject -Skip 1

我们将看到PowerShell确实在每个输入项中调用process块一次

代码语言:javascript
复制
Skipping 1
Selecting 2
Selecting 3

然而,如果我们像在第二个示例中那样传递对象:

代码语言:javascript
复制
PS C:\> $a = 1,2,3
PS C:\> $b2 = Select-FakeObject -Skip 1
Skipping 1 2 3

现在我们看到,process块只在所有$a上执行一次,而不是单个项。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57064839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档