我只是在学习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
的下一个函数的数字?
我不想进行预验证,因为可能的选项可以是整数或字符串。
答案 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 )
请注意,这是比参数版本更多的代码,更复杂,并且您无法使其自动化。