Switch/case 声明
Switch/case statement
我有一个名为 tabLength
的函数,它 应该 return 一个字符串。这用于在文本文档中设置格式。
任何人都可以检查我的 switch 语句,看看为什么我在第 6 行收到错误。那是 switch 语句正在经历的 'case'。
Function tabLength ( $line ) {
$lineLength = $line.Length
switch -regex ( $lineLength ) {
"[1-4]" { return "`t`t`t" }
"[5-15]" { return "`t`t" }
"[16-24]" { return "`t" }
default { return "`t" }
}
}
错误信息:
Invalid regular expression pattern: [5-15].
At C:\Users\name\desktop\nslookup.ps1:52 char:11
+ "[5-15]" <<<< { return "" }
+ CategoryInfo : InvalidOperation: ([5-15]:String) [], RuntimeException
+ FullyQualifiedErrorId : InvalidRegularExpression
只有通过 [5-15]
发送的值才会发生这种情况。
[5-15]
不是有效的正则表达式字符 class。你匹配的是字符串,而不是数字,所以 [5-15]
本质上说 "match a single character from '5' through '1', or '5'" 这不是你想要的。
如果删除中间条件,[16-24]
应该会失败。
尝试不使用正则表达式但使用脚本块作为条件的 switch
语句,以便您可以使用范围进行测试,如下所示:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch ( $lineLength ) {
{ 1..4 -contains $_ } { return "`t`t`t" }
{ 5..15 -contains $_ } { return "`t`t" }
{ 16..24 -contains $_ } { return "`t" }
default { return "`t" }
}
}
在 powershell 3+ 中,您可以使用 -in
运算符并反转顺序:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch ( $lineLength ) {
{ $_ -in 1..4 } { return "`t`t`t" }
{ $_ -in 5..15 } { return "`t`t" }
{ $_ -in 16..24 } { return "`t" }
default { return "`t" }
}
}
正则表达式逐字符匹配,而不是整数。 [5-15]
范围对于正则表达式引擎来说根本没有意义。
尝试添加锚点:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch -regex ( $lineLength ) {
"^[1-4]$" { return "`t`t`t" }
"^[5-9]$|^1[0-5]$" { return "`t`t" }
"^1[6-9]$|^2[0-4]$" { return "`t" }
default { return "`t" }
}
}
抢先回答您的直接问题。但是,由于您说您的目标是格式化文本,您可能需要考虑一种完全不同的方法。
PowerShell 有一个 format operator (-f
),允许您以各种方式格式化字符串(以及数字或日期)。例如,如果您希望文本与 30 个字符宽的列的右侧对齐(即左填充文本),您可以这样做:
Function alignRight ( $line ) {
'{0,30}' -f $line
}
您也可以将其用于右侧填充的列。
示范:
PS C:\> <b>'-{0,5}-' -f 'abc'</b>
- abc-
PS C:\> <b>'-{0,-5}-' -f 'abc'</b>
-abc -
我有一个名为 tabLength
的函数,它 应该 return 一个字符串。这用于在文本文档中设置格式。
任何人都可以检查我的 switch 语句,看看为什么我在第 6 行收到错误。那是 switch 语句正在经历的 'case'。
Function tabLength ( $line ) {
$lineLength = $line.Length
switch -regex ( $lineLength ) {
"[1-4]" { return "`t`t`t" }
"[5-15]" { return "`t`t" }
"[16-24]" { return "`t" }
default { return "`t" }
}
}
错误信息:
Invalid regular expression pattern: [5-15].
At C:\Users\name\desktop\nslookup.ps1:52 char:11
+ "[5-15]" <<<< { return "" }
+ CategoryInfo : InvalidOperation: ([5-15]:String) [], RuntimeException
+ FullyQualifiedErrorId : InvalidRegularExpression
只有通过 [5-15]
发送的值才会发生这种情况。
[5-15]
不是有效的正则表达式字符 class。你匹配的是字符串,而不是数字,所以 [5-15]
本质上说 "match a single character from '5' through '1', or '5'" 这不是你想要的。
如果删除中间条件,[16-24]
应该会失败。
尝试不使用正则表达式但使用脚本块作为条件的 switch
语句,以便您可以使用范围进行测试,如下所示:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch ( $lineLength ) {
{ 1..4 -contains $_ } { return "`t`t`t" }
{ 5..15 -contains $_ } { return "`t`t" }
{ 16..24 -contains $_ } { return "`t" }
default { return "`t" }
}
}
在 powershell 3+ 中,您可以使用 -in
运算符并反转顺序:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch ( $lineLength ) {
{ $_ -in 1..4 } { return "`t`t`t" }
{ $_ -in 5..15 } { return "`t`t" }
{ $_ -in 16..24 } { return "`t" }
default { return "`t" }
}
}
正则表达式逐字符匹配,而不是整数。 [5-15]
范围对于正则表达式引擎来说根本没有意义。
尝试添加锚点:
Function tabLength ( $line ) {
$lineLength = $line.Length
switch -regex ( $lineLength ) {
"^[1-4]$" { return "`t`t`t" }
"^[5-9]$|^1[0-5]$" { return "`t`t" }
"^1[6-9]$|^2[0-4]$" { return "`t" }
default { return "`t" }
}
}
PowerShell 有一个 format operator (-f
),允许您以各种方式格式化字符串(以及数字或日期)。例如,如果您希望文本与 30 个字符宽的列的右侧对齐(即左填充文本),您可以这样做:
Function alignRight ( $line ) {
'{0,30}' -f $line
}
您也可以将其用于右侧填充的列。
示范:
PS C:\> <b>'-{0,5}-' -f 'abc'</b>
- abc-
PS C:\> <b>'-{0,-5}-' -f 'abc'</b>
-abc -