【问题标题】:PowerShell wait for output from function or invoke-commandPowerShell 等待函数或调用命令的输出
【发布时间】:2020-11-19 14:09:51
【问题描述】:

我有一个脚本块/函数,它返回 PSCustomObject 后跟 Write-Host。

我想先得到输出,然后打印写入主机,但我似乎无法弄清楚。

function ReturnArrayList {
    param (
    [int] $number
    )
    [System.Collections.ArrayList]$folderList = @()
    $folderObject = [PSCustomObject]@{
                    Name    = 'John'
                    number   = $number
       
    }       
    #Add the object to the array
    $folderList.Add($folderObject) | Out-Null      

    return $folderList
}

$sb = {
        param (
    [int] $number
    )
    [System.Collections.ArrayList]$folderList = @()
    $folderObject = [PSCustomObject]@{
                    Name    = 'John'
                    number    = $number       
    }       
    #Add the object to the array
    $folderList.Add($folderObject) | Out-Null      

    return $folderList

}

ReturnArrayList -number 5

#Invoke-Command -ScriptBlock $sb -ArgumentList 5

Write-Host "This write host should come later"

结果:

This write host should come after

Name number
---- ------
John      5

想要的结果:

Name number
---- ------
John      5

This write host should come after

如何先获取返回结果并打印 write-host 消息? 提前感谢您的帮助!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以强制 PowerShell 在到达Write-Host 之前将来自ReturnArrayList 的输出写入屏幕,方法是将其通过管道传送到Format-* cmdlet 或Out-Default 之一:

    $object = ReturnArrayList -number 5
    $object |Out-Default
    
    Write-Host "This write host should come later"
    

    结果:

    Name number
    ---- ------
    John      5
    
    
    This write host should come later
    

    请注意,您的 ReturnArrayList 函数实际上并未返回 ArrayList - PowerShell 将自动枚举 $folderlist 中的项目,并且由于它只包含一个项目,因此结果只是一个 PSCustomObject,"可以说是从 ArrayList 中解包出来的:

    PS ~> $object = ReturnArrayList -number 5
    PS ~> $object.GetType().Name
    PSCustomObject
    

    要将可枚举类型保留为函数的输出,您需要使用Write-Output -NoEnumerate,或使用, 运算符将其包装在一个数组中:

    function ReturnArrayList {
        param (
        [int] $number
        )
        [System.Collections.ArrayList]$folderList = @()
        $folderObject = [PSCustomObject]@{
                        Name    = 'John'
                        number   = $number
           
        }       
        #Add the object to the array
        $folderList.Add($folderObject) | Out-Null      
    
        return ,$folderList
        # or
        Write-Output $folderList -NoEnumerate
    }
    

    【讨论】:

      【解决方案2】:

      数据通常输出到管道,而Write-Host绕过管道直接写入控制台。

      使用Write-Output 而不是Write-Host 将解决此问题。您可以轻松找到有关此主题的更深入信息,何时不去Write-Host

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-14
        • 2017-10-07
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多