我正在尝试使变量等于范围。 我的脚本包括用户输入,并且此输入必须在一定范围内。我将在脚本中多次使用该范围,因此我希望它是一个变量。 这是我尝试过的:
$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有效。
答案 0 :(得分:2)
您已经意识到,未加引号的表达式(例如1..18
的效果非常好:它使用 PowerShell的range operator (..
)创建从1
到18
的连续整数数组;也就是说,它等效于以下数组 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>