如何在PowerShell中使变量成为范围?

时间:2019-01-21 19:18:38

标签: powershell variables scripting range

我正在尝试使变量等于范围。 我的脚本包括用户输入,并且此输入必须在一定范围内。我将在脚本中多次使用该范围,因此我希望它是一个变量。 这是我尝试过的:

    $serverrange = "1..18"

我已经尝试过

    $serverrange = 1..18

我已经用谷歌搜索过,但是对此却找不到很多。问题是PowerShell不会将其视为范围,而是从字面上将其视为1..18。 因此,如果我执行Write-Output $ serverrange,它将显示为“ 1..18”。所以我的问题是如何获取它以将其视为范围,或者如何更改脚本以合并该范围? 这是脚本的其余部分:

     #user input for how many servers will be tested
     $numofservers = Read-Host -Prompt "How many servers are being tested?"
     if($numofservers -eq $serverrange) {
     "Proceed"
     } 
     else {
     "Server limit exceeded"
      }

编辑:没意识到$ serverrange = 1..18有效。

3 个答案:

答案 0 :(得分:2)

您已经意识到,未加引号的表达式(例如1..18的效果非常好:它使用 PowerShell的range operator (..)创建从118的连续整数数组;也就是说,它等效于以下数组 literal

 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18

相反, "1..18"是一个(可扩展的)字符串,其内容按原样打印(在这种情况下,字面意义为1..18该字符串既不包含变量引用也不包含子表达式。

重要:在技术上可以使用 Invoke-Expression 字符串评估为PowerShell 声明(例如Invoke-Expression "1..18"),应避免使用此方法Invoke-Expression罕见的正确的工具会带来安全风险 ,尤其是在用户输入未经消毒的情况下-参见the PowerShell-team blog post entitled "Invoke-Expression considered harmful"

您的挑战似乎是根据用户输入 创建的,这样的范围(默认情况下是 string ,由{{ 1}}。

范围运算符能够动态将任一操作数(范围端点)转换为整数,并且愉快地接受表达式作为范围端点

Read-Host

如果输入1..(Read-Host 'Enter the upper bound') (如前所述,返回为 string ),PowerShell会动态地将该字符串转换为其等效的整数,并创建数组3,其数组默认输出如下:

1..3

也就是说,按照(strong)的顺序,(a)提供用户友好的提示,(b)强制执行预定范围的输入(数字),需要做更多的工作。。

因此:

  • 确保用户输入的内容可以转换为(a)(b)落在预期范围内的数字;如果没有,请再次提示。

  • 一旦收到有效输入,请根据需要使用PowerShell的范围运算符(1 2 3 )构造索引数组。

..

答案 1 :(得分:1)

这对我有用:

> $p = 1..18
> $p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>

使用: PS版本5.1.14393.1944

答案 2 :(得分:0)

如果您有字符串“ 1..18”,则可以使用invoke-expression对其进行评估,例如:

PS C:\Users\chris> $s = "1..18"
PS C:\Users\chris> $s
1..18
PS C:\Users\chris> $r = invoke-expression $s
PS C:\Users\chris> $r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS C:\Users\chris>