2017-01-01 4 views
2

Я пытаюсь разобрать некоторые файлы журнала 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

Вместо использования 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() возвратов:

switch($line.StartsWith("'E")){ 
    $true { 
    # $line starts with 'E 
    } 
    $false { 
    # $line doesn't start with 'E 
    } 
} 
+0

Vote ++. Gordon -> Дополнительная информация здесь: http://powershellprimer.com/html/0008.html –

+0

Я думаю, что опция Regex является самой элегантной. Обычно я пытаюсь найти подход без регулярных выражений и использую только Regex, когда нет другого (лучшего) способа сделать это. В этом случае кажется, что regex лучше. – Gordon

+0

Если это так, я бы пошел по шаблону в этом случае –

1

Вы также можете использовать метод Substring.

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