Using range operator with a step
Asked Answered
I

1

4

The PowerShell range operator generates a list of values:

>1..6

1
2
3
4
5
6

How can I generate a list of values with a specific step? For example, I need a list from 1 to 10 with step 2.

Imtiaz answered 24/11, 2015 at 11:16 Comment(0)
B
8

The range operator itself doesn't support skipping/stepping, but you could use Where-Object (or the Where() method if you're running version 4.0 or above) to filter out every second:

PS C:\> (1..10).Where({$_ % 2 -eq 0})
2
4
6
8
10

Version 2.0 and up:

PS C:\> 1..10 |Where-Object {$_ % 2 -eq 0}
2
4
6
8
10
Bili answered 24/11, 2015 at 11:21 Comment(8)
understand, but my powershell returns error for published sample. Updated code (1..10) | where ({$_ % 2 -eq 0}) returns correct resultImtiaz
@constructor: I guess the capability to call extension methods is new in PowerShell 5. I haven't seen or used it either so far. I also think most PowerShell code should not use LINQ but rather the respective cmdlets.Stereoscopy
Ahh, you are running PowerShell 2.0? If so, the Where() method doesn't exist, but yes, as mentioned, the Where-Object cmdlet will work just as wellBili
@Stereoscopy The Where() extension method was introduced in PowerShell 4.0 - it's not LINQ, it's a PS language feature. OP didn't mention which version he was runningBili
Oh, nice to know. I kinda lost track of the newer language features.Stereoscopy
I have assuming lowest common denominator for answers lately. I am missing out on newer features as well :(Exegetic
@Exegetic Unless there's an obvious idiomatic way of doing something, I usually try to present alternatives. .Where() operates significantly faster on large collections (no pipeline overhead)Bili
I wonder why no one commented on the fact this is actually a bit different than what was requested. The steps should be offset from the original position and not from 0, as is the common interpretation of steps on a range. Should probably update the condition in the answer to be ($_-<first-element>) % 2 -eq 0 or 1..10 |Where-Object {($_-1) % 2 -eq 0} in this specific case.Stingaree

© 2022 - 2024 — McMap. All rights reserved.