Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PowerShell中将变量设置为范围?_Powershell_Variables_Scripting_Range - Fatal编程技术网

如何在PowerShell中将变量设置为范围?

如何在PowerShell中将变量设置为范围?,powershell,variables,scripting,range,Powershell,Variables,Scripting,Range,我试图使一个变量等于一个范围。 我的脚本包含用户输入,该输入必须在一定范围内。我将在脚本中多次使用该范围,因此我希望它是一个变量。 这就是我尝试过的: $serverrange = "1..18" 我已经试过了 $serverrange = 1..18 我已经在谷歌上搜索过了,但是我找不到太多关于这个的信息。问题是PowerShell不将其视为范围,而是将其视为1..18。 因此,如果我写入输出$serverrange,它将显示为“1..18”。因此,我的问题是如何让它将其视

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

    $serverrange = "1..18"
我已经试过了

    $serverrange = 1..18
我已经在谷歌上搜索过了,但是我找不到太多关于这个的信息。问题是PowerShell不将其视为范围,而是将其视为1..18。 因此,如果我写入输出$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起作用。

如果您有一个字符串“1..18”,则可以使用来计算它,例如:

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>
这对我很有用:

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

正如您所意识到的,一个不带引号的表达式,如
1..18
工作得非常好
:它使用PowerShell创建一个从
1
18
的连续整数数组;i、 例如,它等效于以下数组文字:

相比之下,
“1..18”
是一个(可扩展的)字符串,其内容按原样打印(在本例中为literal
1..18
,因为该字符串既不包含变量引用,也不包含子表达式)

重要:虽然在技术上可以使用
调用表达式
将字符串作为PowerShell语句进行求值(例如,
调用表达式“1..18”
),应避免这种方法:
调用表达式
很少是正确的工具会带来安全风险,特别是对于未初始化的用户输入-请参阅

您的挑战似乎是基于用户输入创建这样一个范围,默认情况下这是一个字符串,由
读取主机返回

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

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

1
2
3
也就是说,为了(a)提供用户友好的提示(b)强制执行预定义的输入范围(数字),需要做更多的工作

因此:

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

  • 收到有效输入后,根据需要使用PowerShell的范围运算符(
    )构建索引数组


将范围括在引号中使其成为字符串。[grin]此外,
读取主机
cal返回。。。一串。您的第二个示例给出了一个适当的范围,请尝试使用
$VarName.GetType()
测试$Variables,以查看变量中包含的内容。您想使用哪种.net类型?Net是否像其他平台/语言一样有一些“范围”类型?@Lee_Dailey,谢谢你的回答。我没有意识到第二种选择是有效的,我的错。你知道如果用户输入在这个范围内,我如何让它显示“继续”吗?@techguy1029-你的测试是针对
$ServerLimit
,但我看不出你在哪里设置的。如果您想查看
$numofservers
是否在范围内,请将其强制为[int],然后使用
$numofservers-in$serverrange
。这样就行了!感谢您提供更多信息。如何让脚本接受该范围?如果我输入除1以外的任何数字,我将获得第二条消息,而不是第一条消息。您可以使用
-contains
,例如
$x=“2”;如果(1..18-包含$x){“Gotcha”}
。虽然您的解决方案在技术上可行,但:它很少是正确的工具,并且存在安全风险。是的,我在谷歌上搜索了您所说的,我还想提供更多信息,说明为什么调用表达式不太安全。这很有趣。作为一个新的powershell用户,我不知道。因此,如果
Invoke Expression
不是一个好办法,您会建议如何处理从文本文件()抓取的范围?是否有一种替代方法,例如,
“1..10”-作为[???]
,或者有一种方法,例如,
获取内容
将字符串解释为范围或整数?@FatalBulletHit
[int]$from,[int]$to=“1..10”-split'\.\$从..$到
1
2
3
# Define the implied lower bound and the maximum upper bound.
$lowerBound = 1
$maxUpperBound = 18

# Prompt the user for the upper bound of the range, with validation,
# until a valid value is entered.
do {
  $userInput = Read-Host -Prompt "How many servers are being tested?"
  if (
    ($upperBound = $userInput -as [int]) -and 
    ($upperBound -ge $lowerBound -and $upperBound -le $maxUpperBound)
  ) {
    break # valid value entered, exit loop.
  } else {
    # Invalid input: Warn, and prompt again.
    Write-Warning "'$userInput' is either not a number or is outside the expected range of [$lowerBound,$maxUpperBound]."
  }
} while ($true)

# Create the array of indices based on user input.
1..$upperBound