检查读取主机是否为交换机的数字



我只是在学习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传递给下一个函数?

我不想预先验证,因为可能的选项可以作为整数或字符串出现。

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

# 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参数(因为它将其指定为默认参数集(。

现在我更了解你的问题,这可以通过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 )

请注意,这是比参数版本更多的代码,更复杂,您无法自动执行它。

最新更新