带步长的循环范围

问题描述 投票:0回答:3

我正在尝试从 BATCH 迁移到 PowerShell,并且我正在尝试转换我自己的脚本。

我的问题是循环范围:我原来的 BATCH 脚本就像

   for /L %%U in (123,2,323) do ECHO %%U

并将打印

123
125
127
...

使用 Powershell,范围将为 123..323,因此

123..323 | % {Echo $_ }

会给我

123
124
125
...

有没有办法设置步长不同于 1 的范围?我找到的所有示例要么列出所有数字(我有数百个......),要么使用数字之间的两点。

powershell foreach range
3个回答
13
投票

简单的谷歌搜索应该可以找到这个。

for ($i=123; $i -le 323; $i=$i+2 ) {Write-Host $i;}

(初始化;保持循环运行的条件;迭代)


4
投票

使用原来的方法(步骤2):

(123..323) | % {if( $_ -band 1 ) {$_ }}

第 3 步及以上步骤:

 (123..323) | % {if( !($i++ % 3) ) {$_ }} 

0
投票

创建步长值为 n 的范围(假设变量

$n
包含步长值)的更简洁方法是:

1..25 | ? { !($_ % $n) } 

?
Where-Object
cmdlet 的别名。并且
$_ % $n
可以更明确地写为
$_ % $n -eq 0
,因此上面也可以写为:

1..25 | Where-Object { $_ % $n -eq 0 }

Where-Object
充当过滤器,仅包含与步长的模等于0的值:
$_ % $n -eq 0
。 之所以可以写成
!($_ % $n)
,是因为 PowerShell 将
0
视为
false
,将其他数字视为
true
。因此,用
0
否定
!
会使其计算为
true
,然后使数字包含在范围内。

因此,对于步骤 2,您可以这样写:

123..323 | ? { !($_ % 2) }  

这仅包括偶数 (

124, 126, ...
)。 要仅包含奇数(从 123 开始),一个简单的技巧是:

123..323 | ? { $_ % 2 }

当模数为 1(奇数发生)时,它包含在最终范围内。

© www.soinside.com 2019 - 2024. All rights reserved.