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

标签 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 有效。

最佳答案

您已经意识到,未引用 表达式(例如 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 来评估 string 作为 PowerShell 声明(例如,Invoke-Expression "1..18"),这种方法应该避免:Invoke-Expression很少是正确的工具并且提供了一个安全风险,尤其是未经处理的用户输入 - 请参阅 the PowerShell-team blog post entitled "Invoke-Expression considered harmful"

您的挑战似乎是根据用户输入创建这样一个范围,默认情况下它是一个字符串,由 Read-Host 返回。

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

1..(Read-Host 'Enter the upper bound') 

如果您输入 3(如前所述,它作为 字符串 返回),PowerShell 会将该字符串动态转换为其等效整数并创建数组 1..3 ,其默认输出如下所示:

1
2
3

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

因此:

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

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

# 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

关于powershell - 如何在PowerShell中使变量成为范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54296497/

相关文章:

windows - 如何以与 "cmd/c <command>".execute() 相同的方式从 groovy 运行 PowerShell 命令?

powershell - Powershell Hashtable-在嵌套脚本 block 中访问外部对象

javascript - 从javascript函数外部获取变量值

error-handling - Wget无法下载文件但浏览器可以

javascript - 根据 ComboBox 选择设置字段

linux - 用于递减传递参数的 Shell 脚本

azure - 使用 powershell 将 Azure Key Vault 证书导入到应用服务?

MySQL:如何选择具有相同 id 的最新行

PHP jQuery MySQL 即时刷新

c# - 使用动态值构造的名称定义对象