在开关中启动

时间:2017-01-01 17:08:06

标签: powershell powershell-v2.0

我正在尝试解析一些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"
        }
    }

这很有效,但也似乎不太优雅。那么,我找到了一个或最好的答案,还是我在这里找到了一个更好的方法?

2 个答案:

答案 0 :(得分:3)

您可以使用String.StartsWith()

,而不是使用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,因为这是{{1} } return:

StartsWith()

答案 1 :(得分:1)

您也可以使用Substring方法。

switch ($line.Substring(0,3)) {
    "'E " {
        # handle Timestamp
    }
    "'H " {
        # handle Timestamp
    }
    "'C " {
        # handle Timestamp
    }
    Default {}
}