在另一个函数中组合 PowerShell 的 Out-String

Composing PowerShell's Out-String within another function

我希望能够编写一个不填充或截断结果输出的 PowerShell Out-String 版本。我可以使用以下代码实现类似的目的:

Write-Host (Get-ChildItem env: | Out-String -Stream -Width 9999 | ForEach-Object { "$($_.Trim())`n" })

产生所需的输出:

 Name                           Value
 ----                           -----
 ALLUSERSPROFILE                C:\ProgramData
 APPDATA                        C:\Users\Me\AppData\Roaming
... etc ...

我想在 Out-String 的新版本中加入此功能,但不知道如何实现。这和我得到的一样接近:

filter Out-String2 {
  $_ | Out-String -Stream -Width 9999 | ForEach-Object { "$($_.Trim())`n" }
}

Write-Host (Get-ChildItem env: | Out-String2)

但这会导致 Get-ChildItem 的每个元素在过滤器中独立呈现的不良影响,导致输出如下:

 Name                           Value
 ----                           -----
 ALLUSERSPROFILE                C:\ProgramData

 Name                           Value
 ----                           -----
 APPDATA                        C:\Users\Me\AppData\Roaming

...etc...

这种管道元素的组合在 PowerShell 中是否可行?如果可行,如何实现?

这在 filter 上不起作用,但您可以使用 Automatic variable $input 如果您从中创建一个函数:

function Out-String2 {
    Param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        $Data
    )
    # if the data is sent through the pipeline, use $input to collect is as array
    if ($PSCmdlet.MyInvocation.ExpectingInput) { $Data = @($input) }
    $Data | Out-String -Stream -Width 9999 | ForEach-Object { "$($_.Trim())`r`n" }
}

使用

调用它
Write-Host (Out-String2 (Get-ChildItem env:))

Write-Host (Get-ChildItem env: | Out-String2)