我需要在PowerShell FOREACH循环中处理大量数字。我收到以下例外情况:
无法将值"60000000000“转换为键入"System.Int32”
[long]$LargeNumber = 60000000000
foreach ($i in 1..$LargeNumber) {
$i
}我做错什么了?
发布于 2019-07-16 18:05:16
似乎powershell的范围运算符(..)有一个限制,将输入参数限制为Int32。我找不到正式文件,但是根据这一页
2限制和警告只有两个关于范围使用的基本限制。第一个限制是范围内的数字必须在-2,147,483,648和2,147,483,647之间,包括在内;这一限制是因为PowerShell的range运算符将值更改为32位.NET整数,后者只能接受这些值。第二个限制是,单个范围不能包含超过50,001项。
发布于 2019-07-16 21:48:00
这似乎很管用。但我没等它结束。六百万的措施-命令花了29秒。
measure-command { for($i = 0; $i -le 6000000; $i++) { $i } }
Seconds : 29大概3天就可以绕600亿圈?
$LargeNumber = 60000000000
for($i = 0; $i -le $largenumber; $i++) { $i }使用范围运算符(450 gigs?)创建一个由8个字节整数组成的600亿个数组可能是不切实际的。观看Powershell的工作集内存高达259.61兆和160万。我差点把我的电脑撞坏了。我在一台带有ps 6的mac电脑上。
get-process pwsh
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 77.98 3,212.20 39615 …02 pwsh
$a = 1..6000000
get-process pwsh
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 259.61 3,275.24 39615 …02 pwsh发布于 2019-07-16 18:20:01
只是为了完成。我像下面这样调整代码以使其工作。
[long]$LargeNumber = 60000000000
[long]$i = 0
while (1 -eq 1) {
$i
if ($i -gt $LargeNumber) {
break
}
$i++
}https://stackoverflow.com/questions/57062678
复制相似问题