ValueFromPipeline行为?

Tor*_*edt 11 powershell

我有一个命令Get-Testdata,它从不同的源检索测试数据,并将这些数据存储为PSObject具有不同值的属性.然后将对象的总数存储为数组,以便于操作,排序,计算等.

我的问题是我希望能够将这些数据呈现为(颜色编码的)HTML,我为此编写了另一个命令Show-TestResults.输入参数如下所示

[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]
[PSObject[]]$InputObject
Run Code Online (Sandbox Code Playgroud)

更新1

这个函数本身是非常基础的,它只是设置了一些参数ConvertTo-HTML,然后将对象传递给该命令:

$head = "<style>[...]" #styling with javascript etc
$header = "<H1>Test Results</H1>
$title = "Test results"
$InputObject | ConvertTo-HTML -head $head -body $header -title $title | Out-File $Filename
Run Code Online (Sandbox Code Playgroud)

END UPDATE 1

但是,当我尝试使用该ValueFromPipeline属性时,使用该调用

Get-Testdata [...] | Show-TestResults 
Run Code Online (Sandbox Code Playgroud)

仅显示数组中的第一个对象.但是,如果我改为调用命令

$td = Get-Testdata [...]
Show-TestResults $td 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样呈现整个阵列.有人可以解释一下 - 并希望引导我纠正它吗?

ste*_*tej 10

您可能在结束块中处理数据,而不是处理块.

看一个例子:

function getdata {
    1
    2
    3
    4
}
function show-data {
    param(
        [Parameter(mandatory=$true, ValueFromPipeline=$true)]$InputObject,
        [Parameter(mandatory=$true)]$FileName
    )

    # this is process block that is probably missing in your code
    begin { $objects = @() }
    process { $objects += $InputObject }
    end {
        $head = "<style></style>"
        $header = "<H1>Test Results</H1>"
        $title = "Test results"
        $objects | ConvertTo-HTML -head $head -body $header -title $title | Out-File $Filename
    }
}

getdata | show-data -file d:\temp\test.html
Run Code Online (Sandbox Code Playgroud)


Rom*_*min 5

如果需要高级功能,那么我会采用@stej提出的方式。

否则,当函数同时接受管道和参数输入时,我会考虑采用这种简单的技术:

function Show-Data
(
    $FileName,
    $InputObject
)
{
    # this is the trick:
    if ($InputObject) { $input = $InputObject }

    # process the input (from pipeline or parameter)
    $input | ConvertTo-HTML > $FileName
}

# pipe data
Get-ChildItem | Show-Data Test1.htm

# pass via parameter
Show-Data Test2.htm (Get-ChildItem)
Run Code Online (Sandbox Code Playgroud)

NB $input在这种情况下是管道输入的自动变量。