检查Read-Host是否是Switch的数字

时间:2018-08-24 16:00:06

标签: powershell

我只是在学习switch来使我的逻辑更清晰,它似乎可以工作,除了我无法确定我的Read-Host值是否是数字(对于接入点数字)选择)。

     ## Give option to reset all aps on site
    $continueVal = Read-Host "`nSpecify AP # to see more details or type 'Reset' to reset all APs in Store $Store"

##启动开关

$event = switch ($continueVal) {
    [int]{
        $apNumber = $continueVal
        Query-AP($apNumber)
    }
    'Reset' {
        Manage-Prelim($e = 2)
    }
    default {
        Repeat
    }
}

当我使用If/Else/ElseIf时,我会使用if($continueVal -gt 0),虽然可以,但是仍然很脏。对于switch,看来-gt 0的语法不正确并且失败。我该如何有效地检查$continueVal的值是否是一个将其传递给$apNumber的下一个函数的数字?

我不想进行预验证,因为可能的选项可以是整数或字符串。

2 个答案:

答案 0 :(得分:2)

这是使用参数和参数集的另一种方法:

# testscript.ps1
[CmdletBinding(DefaultParameterSetName = "APNumber")]
param(
  [Parameter(Mandatory = $true,ParameterSetName = "APNumber")]
  [Int] $APNumber,

  [Parameter(Mandatory = $true,ParameterSetName = "Controller")]
  [String] $Controller,

  [Parameter(Mandatory = $true,ParameterSetName = "Reset")]
  [Switch] $Reset
)

switch ( $PSCmdlet.ParameterSetName ) {
  "APNumber" {
    "You specified -APNumber with value '$APNumber'"
    break
  }
  "Controller" {
    "You specified -Controller with value '$Controller'"
    break
  }
  "Reset" {
    "You specified -Reset"
    break
  }
}

此脚本易于使用。用法示例:

testscript -APNumber 3
testscript -Controller "foo"
testscript -Reset

如果省略任何参数,它将提示输入-APNumber参数(因为它指定了默认参数集)。

答案 1 :(得分:1)

现在,我对您的问题有了更多的了解,可以通过switch -regex和解析来完成。这是一个简短的示例:

do {
  $response = Read-Host "Enter a response"
  $valid = $true
  switch -regex ( $response ) {
    '^AP Number \d+$' {
      $arg = [Regex]::Match($_,'\d+$').Value -as [Int]
      Write-Host "You entered 'AP Number $arg'"
      break
    }
    '^Controller \S+$' {
      $arg = [Regex]::Match($_,'\S+$').Value
      Write-Host "You entered 'Controller $arg'"
      break
    }
    '^Reset$' {
      Write-Host "You entered 'Reset'"
      break
    }
    default {
      $valid = $false
      Write-Host "Invalid entry"
    }
  }
}
until ( $valid )

请注意,这是比参数版本更多的代码,更复杂,并且您无法使其自动化。