带有步长的PowerShell循环范围

tv6aics1  于 2023-08-05  发布在  Shell
关注(0)|答案(3)|浏览(96)

我正在尝试从BATCH转移到PowerShell,我正在尝试转换自己的脚本。
我的问题是在循环中的范围:我最初的批处理脚本就像

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

字符串
并将打印

123
125
127
...


对于PowerShell,范围为123..323,因此

123..323 | % {Echo $_ }


会给予我

123
124
125
...


是否有一种方法可以使用不同于1的步长来设置范围?我找到的所有例子要么列出所有的数字(我有几百个...),要么使用数字之间的两个点。

zz2j4svz

zz2j4svz1#

简单的谷歌搜索应该已经找到了你。

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

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

vlf7wbxs

vlf7wbxs2#

使用原始方法(步骤2):

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

字符串
步骤3及以上:

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

rqdpfwrv

rqdpfwrv3#

假设变量$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时,这发生在奇数上,它被包括在最终范围中。

相关问题