2017-01-01 8 views
2

アポストロフィで始まるコメント行とそうでないコマンド行の両方を持つAutodesk Revitジャーナルファイルを解析しようとしています。コメント行は、 'E'または 'H'または 'C'で始まり、タイムスタンプを指定することもできます。だから私は私のロジックがあろうと考え出し:スイッチで開始

If Comment 
    Switch TimeStampType 
Else 
    Command 

私はthisを見つけ、switch ($someString.ToLower())作品ならば、私は考え出し、TOLOWERとSTARTSWITHは全く異なる概念であるとして、その後switch ($line.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" 
     } 
    } 

になってしまいました。だから、私は1つまたは最高の答えを見つけたか、ここで私が行方不明になっているより良いアプローチがありますか?代わりにString.StartsWith()を使用しての

答えて

2

、あなただけ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なので、それはです10は返されます:

​​
+0

投票++。 Gordon - > More info here:http://powershellprimer.com/html/0008.html –

+0

Regexオプションが最もエレガントだと思います。通常、私は非正規表現のアプローチを見つけようとし、それ以外の(より良い)方法がない場合にのみRegexを使用します。この場合、正規表現が最善であるようです。 – Gordon

+0

これが当てはまる場合は、この場合はワイルドカードを使用します –

1

Substringメソッドを使用することもできます。

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