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 {}
}