2017-01-01 6 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

투표 ++. 고든 -> 더 자세한 정보 : 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 {} 
}