StartsWith 在开关中
StartsWith in a switch
我正在尝试解析一些 Autodesk Revit 日志文件,这些文件的注释行均以撇号开头,而命令行则没有。注释行可以进一步以 'E 或 'H 或 'C 开头,以表示我也需要使用的时间戳。所以我想我的逻辑是:
If Comment
Switch TimeStampType
Else
Command
我找到了 this,我想如果 switch ($someString.ToLower())
有效,那么 switch ($line.StartsWith())
也会有效(我知道,这有点牵强,因为 ToLower 和 StartsWith 是完全不同的概念)。
然而,这是投掷
找不到 "StartsWith" 的重载和参数计数:“0”。
在 if ($line.StartsWith("'"))
。但这有点误导,因为如果我 REM 整个开关它不会抛出任何错误,所以错误一定在开关中。
if ($line.StartsWith("'")) {
switch ($line.StartsWith()) {
"'E " {
# handle Timestamp
}
"'H " {
# handle Timestamp
}
"'C " {
# handle Timestamp
}
Default {}
}
} else {
if ($line -like "*$command*") {
Write-Host "$line"
}
}
我也尝试过使用 ` 转义撇号,结果相同,并且使用这样的开关,如 link 中所建议的那样。
{$_ -eq "'E "} {
# handle Timestamp
}
同样的结果。所以最后我得到了
if ($line.StartsWith("'")) {
switch ($line) {
$_.StartsWith("'E ") {
# handle Timestamp
}
$_.StartsWith("'H ") {
# handle Timestamp
}
$_.StartsWith("'C ") {
# handle Timestamp
}
Default {}
}
} else {
if ($line -like "*$command*") {
Write-Host "$line"
}
}
可行,但似乎也不够优雅。那么,我是否找到了一个或最佳答案,或者这里是否有我所缺少的更好的方法?
而不是使用String.StartsWith()
, you could just use a wildcard switch:
switch -wildcard ($line){
"'E *" {
# $line starts with 'E
}
"'H *" {
# $line starts with 'H
}
"'C *" {
# $line starts with 'C
}
}
或正则表达式开关:
switch -regex ($line){
"^'E " {
# $line starts with 'E
}
"^'H " {
# $line starts with 'H
}
"^'C " {
# $line starts with 'C
}
}
请注意,如果您使用 "somestring".StartsWith()
作为您的开关输入参数,您将捕获的唯一值将是 $true
或 $false
,因为那是 StartsWith()
returns:
switch($line.StartsWith("'E")){
$true {
# $line starts with 'E
}
$false {
# $line doesn't start with 'E
}
}
您也可以使用 Substring
方法。
switch ($line.Substring(0,3)) {
"'E " {
# handle Timestamp
}
"'H " {
# handle Timestamp
}
"'C " {
# handle Timestamp
}
Default {}
}
我正在尝试解析一些 Autodesk Revit 日志文件,这些文件的注释行均以撇号开头,而命令行则没有。注释行可以进一步以 'E 或 'H 或 'C 开头,以表示我也需要使用的时间戳。所以我想我的逻辑是:
If Comment
Switch TimeStampType
Else
Command
我找到了 this,我想如果 switch ($someString.ToLower())
有效,那么 switch ($line.StartsWith())
也会有效(我知道,这有点牵强,因为 ToLower 和 StartsWith 是完全不同的概念)。
然而,这是投掷
找不到 "StartsWith" 的重载和参数计数:“0”。
在 if ($line.StartsWith("'"))
。但这有点误导,因为如果我 REM 整个开关它不会抛出任何错误,所以错误一定在开关中。
if ($line.StartsWith("'")) {
switch ($line.StartsWith()) {
"'E " {
# handle Timestamp
}
"'H " {
# handle Timestamp
}
"'C " {
# handle Timestamp
}
Default {}
}
} else {
if ($line -like "*$command*") {
Write-Host "$line"
}
}
我也尝试过使用 ` 转义撇号,结果相同,并且使用这样的开关,如 link 中所建议的那样。
{$_ -eq "'E "} {
# handle Timestamp
}
同样的结果。所以最后我得到了
if ($line.StartsWith("'")) {
switch ($line) {
$_.StartsWith("'E ") {
# handle Timestamp
}
$_.StartsWith("'H ") {
# handle Timestamp
}
$_.StartsWith("'C ") {
# handle Timestamp
}
Default {}
}
} else {
if ($line -like "*$command*") {
Write-Host "$line"
}
}
可行,但似乎也不够优雅。那么,我是否找到了一个或最佳答案,或者这里是否有我所缺少的更好的方法?
而不是使用String.StartsWith()
, you could just use a wildcard switch:
switch -wildcard ($line){
"'E *" {
# $line starts with 'E
}
"'H *" {
# $line starts with 'H
}
"'C *" {
# $line starts with 'C
}
}
或正则表达式开关:
switch -regex ($line){
"^'E " {
# $line starts with 'E
}
"^'H " {
# $line starts with 'H
}
"^'C " {
# $line starts with 'C
}
}
请注意,如果您使用 "somestring".StartsWith()
作为您的开关输入参数,您将捕获的唯一值将是 $true
或 $false
,因为那是 StartsWith()
returns:
switch($line.StartsWith("'E")){
$true {
# $line starts with 'E
}
$false {
# $line doesn't start with 'E
}
}
您也可以使用 Substring
方法。
switch ($line.Substring(0,3)) {
"'E " {
# handle Timestamp
}
"'H " {
# handle Timestamp
}
"'C " {
# handle Timestamp
}
Default {}
}