powershell 带步长的循环范围

vfh0ocws  于 5个月前  发布在  Shell
关注(0)|答案(3)|浏览(60)

我正试图从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的步长来设置一个范围?我找到的所有例子要么列出所有的数字(我有几百个...),要么使用数字之间的两个点。

aij0ehis

aij0ehis1#

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

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

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

agxfikkp

agxfikkp2#

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

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

字符串
步骤3及以上:

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

kyxcudwk

kyxcudwk3#

假设变量$n包含步长值,创建步长值为 n 的范围的更简洁的方法是:

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

字符串
?Where-Object小程序的别名。而$_ % $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时,这发生在奇数上,它被包括在最终范围内。

相关问题