我正在尝试从 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 的范围?我找到的所有示例要么列出所有数字(我有数百个......),要么使用数字之间的两点。
简单的谷歌搜索应该可以找到这个。
for ($i=123; $i -le 323; $i=$i+2 ) {Write-Host $i;}
(初始化;保持循环运行的条件;迭代)
使用原来的方法(步骤2):
(123..323) | % {if( $_ -band 1 ) {$_ }}
第 3 步及以上步骤:
(123..323) | % {if( !($i++ % 3) ) {$_ }}
创建步长值为 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(奇数发生)时,它包含在最终范围内。