这不是一个真正的问题。它可能不是由powershell直接引起的,但我今天遇到了这种奇怪的现象。我甚至感到无聊,并制作了一个点击循环的小脚本,所以没什么大不了的。
这是奇怪的: 当我在循环中添加一个小睡眠以使我的系统因一秒钟的咔嗒声而死亡时,我注意到频率之间的巨大差异:
sleep 0.50001
- 可以清楚地看到它每秒点击两次。
和
sleep 0.5
- 速度更快 - 感觉每秒至少有10次点击。
我已经在浏览器“游戏”cookie点击器上对此进行了测试,以便将其可视化(好吧,并摆脱一些无聊)并且它在那里非常明显。
问题:任何人都可以向我解释为什么0.5
显然比powershell中的0.50001
快得多?
PS:我已经用0.4
,0.6
测试了它 - 就好像0.5是正常和亚音速之间的边界。
答案 0 :(得分:3)
让我们看一下Start-Sleep
的语法:
PS C:\> Get-Command Start-Sleep -Syntax
Start-Sleep [-Seconds] <int> [<CommonParameters>]
Start-Sleep -Milliseconds <int> [<CommonParameters>]
如您所见,默认参数集将Seconds
作为整数休眠。
当您提供Double
时,PowerShell会尝试将您的输入值转换为整数,并且0.5
及以下内容会四舍五入为0
,这要归功于default midpoint rounding mode所使用的通过.NET
因此[int]0.50001
等于1
且[int]0.5
等于0
答案 1 :(得分:0)
问题在于耶森所说的四舍五入。
有一件事:
Sleep
不是PowerShell函数,它是批量文件的一个(因为Jessen正确地说它也是PowerShell和 alias 到{{1}不要混淆他们。)不要混淆他们微软可能决定将Start-Sleep
用于PowerShell而不是简单的Start-Sleep
并为其添加别名。
如果您想这样做, PowerShell 方式使用Sleep
。如果你在那里添加Start-Sleep
,你不会感到困惑:
-Milliseconds
检查它是否为“仅”别名
Start-Sleep [-Seconds] <int> [<CommonParameters>]
Start-Sleep -Milliseconds <int> [<CommonParameters>]