programing

스위치 문의 여러 값에 대한 PowerShell 구문은 무엇입니까?

bestprogram 2023. 4. 22. 10:58

스위치 문의 여러 값에 대한 PowerShell 구문은 무엇입니까?

기본적으로 다음과 같이 하고 싶습니다.

switch($someString.ToLower())
{
    "y", "yes" { "You entered Yes." }
    default { "You entered No." }
}
switch($someString.ToLower()) 
{ 
    {($_ -eq "y") -or ($_ -eq "yes")} { "You entered Yes." } 
    default { "You entered No." } 
}

이것은 기능하고 있어, 보다 읽기 쉬운 것 같습니다.

switch($someString)
{
    { @("y", "yes") -contains $_ } { "You entered Yes." }
    default { "You entered No." }
}

"contains" 연산자는 대소문자를 구분하지 않는 검색을 수행하므로 "ToLower()"를 사용할 필요가 없습니다.대소문자를 구분하려면 "-contains"를 대신 사용할 수 있습니다.

값에 와일드카드를 사용할 수 있어야 합니다.

switch -wildcard ($someString.ToLower())
{
    "y*" { "You entered Yes." }
    default { "You entered No." }
}

정규 표현도 허용됩니다.

switch -regex ($someString.ToLower())
{
    "y(es)?" { "You entered Yes." }
    default { "You entered No." }
}

PowerShell 스위치 매뉴얼:Switch 스테이트먼트 사용방법

regex의 교대 연산자 "|"(파이프)를 사용하여 원래 요청에 맞게 derkerdmann 게시물을 약간 수정했습니다.

또한 regex의 초보자들이 이해하고 읽기가 조금 더 쉽습니다.

regex를 사용하는 동안 문자열 문자 "^"(carett/circumflex)의 시작 및/또는 문자열 문자 "$"($)의 끝을 입력하지 않으면 예기치 않은/의도 없는 동작(예제" 또는 "why"의 일치 등)이 발생할 수 있습니다.

옵션 주위에 그룹화 문자("")를 배치하면 각 옵션의 문자열 시작 문자 및 끝 문자를 배치할 필요가 줄어듭니다.정규식을 잘 모르면 예상치 못한 행동을 할 수 있습니다.물론 사용자 입력을 처리하는 것이 아니라 알려진 문자열 집합을 처리하는 경우 문자열의 그룹화 및 시작 및 끝 없이 더 읽기 쉬워집니다.

switch -regex ($someString) #many have noted ToLower() here is redundant
{
        #processing user input
    "^(y|yes|indubitably)$" { "You entered Yes." }

        # not processing user input
    "y|yes|indubitably" { "Yes was the selected string" } 
    default { "You entered No." } 
}
switch($someString.ToLower())
{
    "yes"   { $_ = "y" }
    "y"     { "You entered Yes." }
    default { "You entered No." }
}

$_ 변수가 각각 재할당된 케이스의 아래/뒤에 타겟케이스가 있는 한 이 방법으로 케이스를 임의로 분기, 캐스케이드 및 Marge할 수 있습니다.


n.b. 이 동작은 귀엽지만 PowerShell 인터프리터가 스위치/케이스를 기대했던 것만큼 효율적으로 구현하지 못하고 있는 것 같습니다.예를 들어, ISE 디버거를 사용하는 것은 최적화된 룩업, 해시 또는 바이너리 브랜치 대신 여러 if-else 문과 같이 각 케이스가 차례로 테스트된다는 것을 의미합니다(그렇다면 가장 일반적인 케이스를 우선시하는 것을 고려하십시오).또한 이 답변에서 보듯이 PowerShell은 사례를 충족한 후 테스트를 계속합니다.그리고 잔인하게도 에서는 특별히 최적화된 '스위치' 운영 코드를 사용할 수 있습니다.이 동작으로 인해 PowerShell은 이를 활용할 수 없습니다.

y|ye|yes 및 대소문자를 구분하지 않습니다.

switch -regex ($someString.ToLower()) {
        "^y(es?)?$" {
            "You entered Yes." 
        }
        default { "You entered No." }
}

여기 또 하나 있어.스위치는 대소문자를 구분하지 않습니다.-eq는 왼쪽에 배열이 있으면 동일한 값을 반환하며 반환되는 모든 값은 True입니다.

switch($someString)
{
  { 'y', 'yes' -eq $_ } { 'You entered Yes.' }
  default               { 'You entered No.'  }
}

js2010이 제시한 답변은 특히 질문의 맥락에서 가치가 있다.다만, Switch 스테이트먼트의 사용 방법의 예를 찾고 있는 유저에게는, 동작 원인에 대한 설명과 몇개의 잠재적인 문제가 필요하게 되는 경우가 있습니다.

-eq연산자(왼쪽 배열 포함)는 오른쪽에 지정된 단일 값과 일치하는 항목만 필터링합니다.단일 값이 반환되면 결과가 단일 값이 되지만 둘 이상의 값이 반환되면 결과가 배열이 됩니다.

가 표시됩니다.-eq비교가 결정되다$false「 」 「 」 , 「 」인 경우, 「 」$null 0. 않으면 0, 0, 0.0, 0, 으로 간주됩니다.$true이는 빈 문자열 테스트가 다음 예시와 같이 실패함을 의미합니다.를 하다를 사용하여 수행하는 줍니다.-ceq 에, 「의이 될 수 동작을 나타냅니다.break문장은 사용되지 않습니다.

foreach ($someString in '', 'C', 'd', 'E') {
    switch($someString) {
        { '', 'b', 'c', 'd', 'g' -eq $_ }   { "-eq: '$_' does Match" }
        { '', 'b', 'c', 'd', 'g' -ceq $_ }  { "-ceq '$_' does Match" }
        default                 { "'$_' doesn't Match" }
    }
}

, 음음음음 as as as as as as as as as as as as as as as as 。''해야 할입니다.-eq의 단일 입니다.''$false, 「」가 됩니다.''이치노

'' doesn't Match
-eq: 'C' does Match
-eq: 'd' does Match
-ceq 'd' does Match
'E' doesn't Match

다른 문제는 다음 예시와 같이 단일 테스트 값을 왼쪽에 배치하고 테스트할 항목의 배열을 오른쪽에 배치하는 것입니다.

foreach ($someString in '', 'C', 'd', 'E') {
    switch($someString) {
        { $_ -eq '', 'b', 'c', 'd', 'g' }   { "-eq: '$_' does Match" }
        { $_ -eq '', 'b', 'c', 'd', 'g' }  { "-ceq '$_' does Match" }
        default                 { "'$_' doesn't Match" }
    }
}

다음 예시와 같이 일치하는 것은 없습니다.

'' doesn't Match   
'C' doesn't Match  
'd' doesn't Match  
'E' doesn't Match

는 시험할 합니다.-eqoperator,및 「」를 가지는 .-eq빈 문자열을 테스트할 때 2개의 빈 문자열 배열을 반환합니다.에 의해 된 빈 .-eq는 비(非)입니다.$null지정하면 으으 value value value value value value value 로 변환됩니다.$true.

foreach ($someString in '', 'C', 'd', 'E') {
    switch($someString) {
        { '', '', 'b', 'c', 'd', 'g' -eq $_ }   { "-eq: '$_' does Match" }
        { '', '', 'b', 'c', 'd', 'g' -ceq $_ }  { "-ceq '$_' does Match" }
        default                 { "'$_' doesn't Match" }
    }
}

다음 예에서 볼 수 있듯이, 다음 예에서 볼 수 있듯이-eq ★★★★★★★★★★★★★★★★★」-ceq 문자열이은 Boolean으로 됩니다.$true 경우, 는 합니다.'':

-eq: '' does Match
-ceq '' does Match
-eq: 'C' does Match
-eq: 'd' does Match
-ceq 'd' does Match
'E' doesn't Match

PowerShell 5.1에 대해 설명하겠습니다. 모두$someString js2010 [고정, 감사 js2010]

$someString = "YES"
$someString = "yes"
$someString = "yEs"
$someString = "y"
$someString = "n"

switch ($someString) {
   {"y","yes" -eq $_} { "You entered Yes." }
   Default { "You didn't enter Yes."}
}

당신과 같은 문제에 대한 해결책을 찾아본 후, 저는 여기서 이 작은 주제를 발견했습니다.사전에 이 스위치에 대한 보다 부드러운 솔루션을 입수했습니다.케이스 스테이트먼트

switch($someString) #switch is caseINsensitive, so you don't need to lower
{
    { 'y' -or 'yes' } { "You entered Yes." }
    default { "You entered No." }
}

언급URL : https://stackoverflow.com/questions/3493731/whats-the-powershell-syntax-for-multiple-values-in-a-switch-statement