我正在编写一个Chunk-Object
可以将对象数组分块为子数组的函数。例如,如果我将一个数组传递给它@(1, 2, 3, 4, 5)
并指定每个块的元素,2
那么它将返回 3 个数组@(1, 2)
和. 如果用户想要在将每个元素分块为子数组之前对其进行处理,用户也可以提供一个可选参数。现在我的代码是:@(3, 4)
@(5)
scriptblock
function Chunk-Object()
{
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)] [object[]] $InputObject,
[Parameter()] [scriptblock] $Process,
[Parameter()] [int] $ElementsPerChunk
)
Begin {
$cache = @();
$index = 0;
}
Process {
foreach($o in $InputObject) {
$current_element = $o;
if($Process) {
$current_element = & $Process $current_element;
}
if($cache.Length -eq $ElementsPerChunk) {
,$cache;
$cache = @($current_element);
$index = 1;
}
else {
$cache += $current_element;
$index++;
}
}
}
End {
if($cache) {
,$cache;
}
}
}
(Chunk-Object -InputObject (echo 1 2 3 4 5 6 7) -Process {$_ + 100} -ElementsPerChunk 3)
Write-Host "------------------------------------------------"
(echo 1 2 3 4 5 6 7 | Chunk-Object -Process {$_ + 100} -ElementsPerChunk 3)
结果是:
PS C:\Users\a> C:\Untitled5.ps1
100
100
100
100
100
100
100
------------------------------------------------
101
102
103
104
105
106
107
PS C:\Users\a>
如您所见,它适用于管道输入的对象,但不适用于从参数获取的值。如何修改代码以使其在这两种情况下都能正常工作?