Es gibt keinen solchen eingebauten so weit ich weiß. Powershell Handhabung der Pipeline und insbesondere seine starken Beharren auf Abrollen enumerables macht es ein bisschen schwierig, die Lage sein, nur eine Funktion Rohr schreibt in, sondern als allgemeinen Ausdruck:
$a = 1..10 # an array contain 1 through 10
$w = 4 # window size of 4
0..($a.Length-$w) | ForEach-Object -Process {
$a[$_..($_+$w-1)]
}
Das macht Prozessanordnungen, die das Fenster, das du willst. Es ist einfacher, so zu sehen:
0..($a.Length-$w) | ForEach-Object -Process {
"This is my window: $($a[$_..($_+$w-1)])"
}
Die Sache ist, wenn man versucht, die über diese Art und Weise zu tun:
0..($a.Length-$w) | ForEach-Object -Process {
$a[$_..($_+$w-1)]
} | ForEach-Object -Process {
"This is my window: $_"
}
Sie sehr enttäuscht sein würde als der „Fenster“ Array abgerollt wurde vor in ForEach-Object
geleitet werden; ein Problem, das Sie mit irgendeiner Pipeline-Funktion haben, die Sie geschrieben haben, um das auch zu handhaben.
Es gibt keine Möglichkeit für sie innerhalb der Funktion zu kompensieren, müssten Sie dafür Sorge tragen, weil auch auf Zuweisung innerhalb des ForEach-Object
Block zu verwenden:
$myWindows = 0..($a.Length-$w) | ForEach-Object -Process {
$a[$_..($_+$w-1)]
}
Es abgerollt werden würde.
Also dann müssen Sie so etwas wie:
$myWindows | ForEach-Object -Process {
"This is my window: $_"
}
Nicht etwas in PowerShell verfügbar, aber [dies könnte nützlich sein] (http://stackoverflow.com/questions/38566936/how-can-i-calculate-a-sliding-window-over-an- Array-in-Powershell)? Was meinst du mit "arbeitet gut mit der PowerShell-Pipeline"? Kannst du zeigen/beschreiben, welches Verhalten du bei einer Sample-Eingabe/Ausgabe erwartest? –
'Funktionsfenster {param ($ size) begin {$ array = [Objekt []] :: new ($ size); $ i = 0} Prozess {if ($ i -lt $ size) {$ array [$ i ++] = $ _; if ($ i -eq $ size) {, @ ($ array)}} else {, @ (($ array = @ ($ array | select -skip 1;, $ _)))}}} ' – PetSerAl