Powershell:将输入限制为一定范围的数值(整数或十进制)

时间:2019-12-29 09:29:02

标签: powershell integer range decimal

我在这里看到了针对不同脚本语言的内容,但是在Powershell中遇到了如下问题: 我想将数值输入(可以是十进制或整数)限制为特定范围。

我尝试了以下操作:

Do { $value = Read-host "Specify a value between 23.976 and 60"}
while ((23.976..60) -notcontains $value )

但是,看起来像这样,它根本不接受任何十进制值,而只接受整数。例如,当我尝试输入29.97或29.970时,它将停留在循环中。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

PowerShell的range operator-..-从范围端点生成离散值数组 ,该数组可以具有以下类型(在给定的表达式,两个端点必须具有相同的类型):

  • [int]System.Int32
    • 例如,1..3创建数组1, 2, 3
    • 注意:虽然允许的最小端点值和最大端点值分别为[int]::MinValue[int]::MaxValue,但所得数组必须另外包含不超过2,146,435,071个元素(2+十亿),这是最大.NET中一维[int]数组的元素计数-有关背景信息,请参见this answer
  • 或者,在PowerShell [Core] 6+中:字符(从概念上讲,[char];从技术上讲,是单字符[string]实例)。
    • 例如,'a'..'c'创建数组'a', 'b', 'c'
除了[int]以外的 数字类型的

实例会被强制强制使用后者。-如果它们可以放入{{ 1}}范围-在这种情况下,对非整数类型进行半点到偶数的中点舍入;例如,隐式[int]实例[double]23.5都被强制为24.5

由于24[int] 23.976,因此您的24表达式将创建数组23.976..60,这不是您的意图。

简而言之:您不能使用24, 25, 26, ..., 60来描述不可计数的非整数范围(分数)

相反,请使用..(大于或等于)和-ge(小于或等于)来测试端点:

-le

另外,为了使-not ($value -ge 23.976 -and $value -le 60) -ge操作按预期工作,-le的返回值转换为始终为字符串,改为数字 。 如果您使用Read-Host直接返回的$value,则会得到 lexical (基于文本排序顺序的)比较,而不是数字比较。

因此,将返回值Read-Host强制转换为Read-Host

[double]

注意:$value = try { [double] (Read-Host 'Specify a value between 23.976 and 60') } catch {} / try处理当用户输入无法解释为catch表示形式的文本时的情况。


将它们放在一起:

[double]

答案 1 :(得分:0)

好的,这就是它的工作原理;)

Do { $value = Read-host "Specify a value between 23.976 and 60"}
while (( $value -gt 60 ) -or ( $value -lt 23.976 ))