我在这里看到了针对不同脚本语言的内容,但是在Powershell中遇到了如下问题: 我想将数值输入(可以是十进制或整数)限制为特定范围。
我尝试了以下操作:
Do { $value = Read-host "Specify a value between 23.976 and 60"}
while ((23.976..60) -notcontains $value )
但是,看起来像这样,它根本不接受任何十进制值,而只接受整数。例如,当我尝试输入29.97或29.970时,它将停留在循环中。
我该怎么做?
答案 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。[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 ))