Select-Object -Property参数可防止在循环中获取对象

时间:2019-08-24 22:52:37

标签: powershell-5.0

请帮助我理解为什么在循环时无法使用Select-Object参数使用-Property输出对象的原因。

以下是示例:

$GPjob = Start-Job -ScriptBlock {Get-Process | Select-Object -First 1}

for ($i = 0 ; $i -lt 200000 ; $i++) {
    if (($GPjob.State -eq 'Completed') -and ($GPjob.HasMoreData)) {
        "Step 1: $(Get-Date) : `$i=$i"
        Receive-Job $GPjob | Select-Object -Property Name
        "Step 2: $(Get-Date) : `$i=$i"
    }
}

应该在Receive-Job周期之一内一个接一个地执行步骤1 $i和步骤2行。因此,我应该一次看到所有三个输出。但是实际上,直到整个循环结束,我才能看到Receive-Job和第2步的输出。

但是,如果我不为-Property使用Receive-Job参数,一切都会按预期进行:我会立即看到所有三个输出。

2 个答案:

答案 0 :(得分:0)

这种方式显示得更快,但我无法解释原因。也许这就是默认值的工作方式。我用&{for()}和foreach-object得到了相同的结果。在ise调试器中,如果在接收作业行上放置一个断点,则在经过“步骤2”行之后,输出便会显示出来。

Receive-Job $GPjob | Select-Object -ExpandProperty Name

答案 1 :(得分:0)

我仍然找不到答案,但是找到了解决方法。 Format-Table解决了这一难题。因此,下一个代码将按预期工作:

$GPjob = Start-Job -ScriptBlock {Get-Process | Select-Object -First 1}

for ($i = 0 ; $i -lt 200000 ; $i++) {
    if (($GPjob.State -eq 'Completed') -and ($GPjob.HasMoreData)) {
        "Step 1: $(Get-Date) : `$i=$i"
        Receive-Job $GPjob | Select-Object -Property Name | ft
        "Step 2: $(Get-Date) : `$i=$i"
    }
}