我有一个命令 Get-Testdata
从不同的源检索测试数据并将其存储到 PSObject
使用不同的值作为属性。然后将对象的总数存储为数组,以便于操作,排序,计算等。
我的问题是我希望能够将这些数据呈现为(颜色编码)HTML,我已经编写了另一个命令, Show-TestResults
。输入参数如下所示
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]
[PSObject[]]$InputObject
更新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
END UPDATE 1
但是,当我尝试使用时 ValueFromPipeline
财产,使用电话
Get-Testdata [...] | Show-TestResults
仅显示数组中的第一个对象。但是,如果我改为调用命令
$td = Get-Testdata [...]
Show-TestResults $td
正如预期的那样呈现整个阵列。有人可以解释一下 - 并希望引导我纠正它吗?
您可能在结束块中处理数据,而不是处理块。
看一个例子:
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
如果要求高级功能,那么我会采用@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)
注: $input
在这种情况下,是管道输入的自动变量。
我认为问题是管道将数组展开到一个对象流中,并一次一个地呈现给你的函数,而不是作为数组。
如果你这样做,它是否有效:
,(Get-Testdata [...]) | Show-TestResults
我遇到了同样的问题和问题,我通常解决这个问题的方式如下:
Function Show-Data {
param(
[Parameter(mandatory=$true, ValueFromPipeline=$true)]$InputObject,
[Parameter(mandatory=$true)]$FileName
)
$PipeLine = $Input | ForEach {$_}; If ($PipeLine) {$InputObject = $PipeLine}
...
因为我不认为这是一个好主意 覆盖 该 自动$输入变量。
无论如何,我还没有看到问题部分的答案:“有人可以解释一下吗?“
我想这与它有关 强烈鼓励的发展指南 其中说明:
支持ProcessRecord方法
要接受管道中前一个cmdlet的所有记录,
您的cmdlet必须实现ProcessRecord方法。视窗
PowerShell多次调用此方法,每次记录一次
发送到您的cmdlet。
该 ProcessRecord
方法在我看来是一个 C# 我推测的方法是由 process
阻止在解决方案中 stej。但这并不能解释为什么这样做会这样 PSCustomObject
数组而不是例如系统对象,如:
Get-psdrive | Show-Data
甚至:
@(Get-psdrive) | Show-Data