我正在尝试解析一些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"
}
}
我也尝试使用`来转义撇号,结果相同,以及使用这样的开关,如链接中所示。
{$_ -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"
}
}
这很有效,但也似乎不太优雅。那么,我找到了一个或最好的答案,还是我在这里找到了一个更好的方法?
答案 0 :(得分:3)
您可以使用String.StartsWith()
:
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
,因为这是{{1} } return:
StartsWith()
答案 1 :(得分:1)
您也可以使用Substring
方法。
switch ($line.Substring(0,3)) {
"'E " {
# handle Timestamp
}
"'H " {
# handle Timestamp
}
"'C " {
# handle Timestamp
}
Default {}
}