2017-01-01 15 views
2

我正在嘗試解析一些Autodesk Revit日誌文件,它們的註釋行都以撇號開頭,命令行沒有。註釋行可以進一步以'E或'H或'C開始,以表示我需要使用的時間戳。所以我想,我的邏輯是:StartsWith在開關中

If Comment 
    Switch TimeStampType 
Else 
    Command 

我發現this,並且我想如果switch ($someString.ToLower())作品,然後switch ($line.StartsWith())將太(我知道,這是一個有點遙不可及,如ToLower將和StartsWith是完全不同的概念)。

但是,這是投擲 找不到「StartsWith」的重載和參數計數:「0」。 at if ($line.StartsWith("'"))。但是這有點誤導,因爲如果我將整個交換機重新啓動,它不會引發任何錯誤,所以錯誤必須存在於交換機中。

 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

而不是使用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,因爲那是什麼StartsWith()返回:

​​
+0

Vote ++。戈登 - >更多信息在這裏:http://powershellprimer.com/html/0008.html –

+0

我認爲,正則表達式選項是最優雅的。通常我會嘗試找到一種非正則表達式的方法,並且只有在沒有其他(更好)方法時才使用正則表達式。在這種情況下,似乎正則表達式是最好的。 – Gordon

+0

如果是這種情況,我會在這種情況下選擇通配符 –

1

您也可以使用Substring方法。

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