请帮助我理解为什么在循环时无法使用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
参数,一切都会按预期进行:我会立即看到所有三个输出。
答案 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"
}
}