如何判断数字是否在PowerShell的范围内

use*_*297 6 powershell

如果主机名值在500-549之间,我需要一种在服务器上启动服务的方法.

如果不在该范围内,则将启动其他服务.

我知道如何做到这一切,除了确定数字是否在500-549之间,因此包含值高达499和550-999的服务器名称将启动其他服务.

例如,期望的结果将是:

server 500 start service A
server 530 start service b
server 660 start service A
Run Code Online (Sandbox Code Playgroud)

nix*_*xda 20

使用-In运算符并使用定义范围..

$a = 200
$a -In 100..300
Run Code Online (Sandbox Code Playgroud)

作为奖励:这也有效.在这里,PowerShell以静默方式将字符串转换为整数

$a = "200"
$a -In 100..300
Run Code Online (Sandbox Code Playgroud)

两个例子的输出是

True
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`100..300`部分创建一个具有201个值的数组(对于更大的范围将消耗大量内存,并且需要初始化),并且数组中的查找需要针对所有vaule进行测试(`-In `无法判断数组是否已排序.即使使用二进制搜索(假设已排序的数组),它仍然需要更多的查找,然后是一个简单的"小于/大于"检查.代码_may_看起来更优雅,但它不是我建议的这个问题的编码风格.. (5认同)
  • 除了 CPU 和内存使用率更差之外,**这是很糟糕、容易出现错误的代码。** A) 浮点范围边界被强制转换为“[Int32]”,这涉及舍入。因此,“2 -In 0..1.5”和“-2 -In -1.5..0”都会产生“$True”。B) 生成的范围始终是整数,因此永远找不到浮点值。`3.14 -In 1..5` 产生 `$False`。C) 最大范围大小是有限的。“0 -In 0..1GB”失败,并显示“数组尺寸超出支持范围”。D) 范围的两端必须适合“[Int32]”。`0 -In (2GB-1)..2GB` 失败,并显示“对于 Int32 来说值太大或太小。” (5认同)

Kei*_*ill 10

如果服务器名称实际上只是一个数字,那么:

$num = [int]$serverName
if ($num -ge 500 -and $num -le 549) {
    ... do one thing
}
else  {
    ... do another
}
Run Code Online (Sandbox Code Playgroud)


oɔɯ*_*ɯǝɹ 9

作为对两个 答案的答复 ; 代码的清晰度和性能都至关重要,因此我进行了一些测试。与所有基准测试一样,您的结果可能会有所不同。我只是以此做为快速测试。

解决方案1

(($value -ge $lower) -and ($value -le $upper))
Run Code Online (Sandbox Code Playgroud)

解决方案2

$value -In $lower .. $upper
Run Code Online (Sandbox Code Playgroud)

测试

$value = 200
$lower = 1

for ($upper = $lower; $upper -le 10000000; $upper += $upper) {
    $a = Measure-Command { (($value -ge $lower) -and ($value -le $upper)) } | Select -ExpandProperty Ticks
    $b = Measure-Command { ($value -in $lower .. $upper) } | Select -ExpandProperty Ticks
    "$value; $lower; $upper; $a; $b"
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

绘制时(在Excel中),我得到以下图:

在此处输入图片说明

结论

对于小范围,解决方案之间没有太大差异。但是,由于确实发生了较大范围的性能下降(从256个元素开始可测量),并且您可能对范围的大小没有影响,并且范围可能因环境而异,我建议使用solution 1。当您不控制范围的大小时,这也很重要。