选择对象使用管道与-InputObject的行为不同

时间:2019-07-16 20:16:55

标签: powershell

有人可以阐明为什么示例2与示例1的结果不同吗?我认为$ a和$ b2应该相同。 $ b2为空!我正在编写一个脚本,其中最好使用示例2中的方法。

示例1:

-------------------------------------------------------------------------
ValueError                                Traceback (most recent call 
last)
<ipython-input-125-c6a3c418689c> in <module>()
  1 nb_epoch = 100
 ----> 2 model.fit(X2,L2, epochs=100)

 10 frames
 /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py 
 in _get_sequence(value, n, channel_index, name)
 71   else:
 72     raise ValueError("{} should be of length 1, {} or {} but was 
 {}".format(
 ---> 73         name, n, n + 2, current_n))
 74 
 75   if channel_index == 1:

 ValueError: strides should be of length 1, 1 or 3 but was 2

示例2:

$a = Get-Content $some_text_file | Select-Object -Skip 1

编辑:使用此语法可使我到达需要的位置。

$b1 = Get-Content $some_text_file
$b2 = Select-Object -InputObject $b1 -Skip 1

1 个答案:

答案 0 :(得分:3)

作为Lee_Dailey notes,这是预期的行为

  

有人可以阐明原因

这与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上执行一次,而不是在单个项目上执行。