You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell函数输出延迟问题:调用其他函数后需脚本结束才显示

解决PowerShell中添加后续函数调用后PSCustomObject输出延迟问题

问题背景

编写的SearchSharedMailboxes函数原本可实时输出匹配的共享邮箱列表,但在函数末尾添加ObjectAssigning调用后,输出需等待整个脚本执行完毕才会显示,无法满足实时输出需求。

原函数代码:

function SearchSharedMailboxes {
param (
    [parameter(Mandatory=$true)] $objectList,
    [parameter(Mandatory=$true)] [string]$objectName
)
    
    $matchingList = [System.Collections.ArrayList]::new()

    if ($objectList.Count -le 0) {
        
    $decision = Read-Host "No match found, search again Y/N?"

        if ($decision -eq "Y") {

            GetSharedMailboxes

        } else {

            Exit-PSSession

        }

    } else {

        Write-Verbose "Matches found:"
        
        $i=0
        $objectList | Foreach-Object {

             [PSCustomObject]@{
                ID = $i
                UserPrincipal = $_.UserPrincipalName
                RecipientTypeDetails = $_.RecipientTypeDetails
                PrimarySMTPAddress = $_.PrimarySMTPAddress
                
            }
            $i++

        }

    }
    
}

添加ObjectAssigning后的修改部分:

$i=0
        $objectList | Foreach-Object {

             [PSCustomObject]@{
                ID = $i
                UserPrincipal = $_.UserPrincipalName
                RecipientTypeDetails = $_.RecipientTypeDetails
                PrimarySMTPAddress = $_.PrimarySMTPAddress
                
            }
            $i++

        }

    }

    ObjectAssigning
    
}

问题原因

PowerShell默认会将函数内所有未被捕获的输出(如直接返回的PSCustomObject)收集到输出集合中,待函数执行完成后统一返回显示。添加ObjectAssigning调用后,函数的所有输出(包括邮箱列表对象和ObjectAssigning的输出)被整体缓冲,导致邮箱列表无法实时显示。

解决方案

在创建PSCustomObject后,通过Out-Host强制将对象实时输出到控制台,绕过PowerShell的输出缓冲机制。修改后的循环代码如下:

$i=0
$objectList | Foreach-Object {
    [PSCustomObject]@{
        ID = $i
        UserPrincipal = $_.UserPrincipalName
        RecipientTypeDetails = $_.RecipientTypeDetails
        PrimarySMTPAddress = $_.PrimarySMTPAddress
    } | Out-Host  # 强制实时输出到控制台
    $i++
}

原理说明

Out-Host直接将输出内容发送到控制台主机,不会将对象加入函数的输出集合中,因此每个PSCustomObject创建后会立即显示,无需等待函数执行完毕。

如果需要同时将对象保留到管道供后续处理,可改用Tee-Object(需注意:此方式仍会将对象加入输出集合,若后续函数有输出,整体缓冲问题可能依然存在,需根据实际需求选择):

$i=0
$objectList | Foreach-Object {
    [PSCustomObject]@{
        ID = $i
        UserPrincipal = $_.UserPrincipalName
        RecipientTypeDetails = $_.RecipientTypeDetails
        PrimarySMTPAddress = $_.PrimarySMTPAddress
    } | Tee-Object -Variable temp | Out-Host
    $matchingList.Add($temp) | Out-Null  # 将对象加入集合
    $i++
}

内容的提问来源于stack exchange,提问作者Maduser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:08:07