기본적으로 이렇게하고 싶습니다.
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 ()”를 사용할 필요가 없습니다. 대소 문자를 구분하려면 대신 “-ccontains”를 사용할 수 있습니다.
답변
값에 와일드 카드를 사용할 수 있어야합니다.
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 문 사용
답변
switch($someString.ToLower())
{
"yes" { $_ = "y" }
"y" { "You entered Yes." }
default { "You entered No." }
}
대상 케이스가 $ _ 변수가 각각 재 할당 된 케이스 아래 / 뒤에 있는 한이 방식으로 케이스를 임의로 분기, 캐스케이드 및 병합 할 수 있습니다 .
nb이 동작만큼이나 귀엽지 만, PowerShell 인터프리터가 기대하거나 예상하는 것만 큼 효율적으로 스위치 / 케이스를 구현하지 않는 것으로 보입니다. 우선, ISE 디버거를 사용한 스테핑은 최적화 된 조회, 해싱 또는 이진 분기 대신 여러 if-else 문처럼 각 사례가 차례로 테스트된다는 것을 의미합니다. (그렇다면 가장 일반적인 사례를 먼저 배치하는 것이 좋습니다.) 또한이 답변에서 볼 수 있듯이 PowerShell은 사례를 충족 한 후 계속 테스트합니다. 그리고 잔인하게도 .NET CIL에서 사용할 수있는 특수 최적화 된 ‘스위치’opcode도 있습니다.이 동작으로 인해 PowerShell은 활용할 수 없습니다.
답변
y | ye | yes 입력을 지원하고 대소 문자를 구분하지 않습니다.
switch -regex ($someString.ToLower()) {
"^y(es?)?$" {
"You entered Yes."
}
default { "You entered No." }
}
답변
정규식의 대체 연산자 “|”(파이프)를 사용하여 원래 요청을 충족하도록 derekerdmann의 게시물을 약간 수정했습니다.
정규식 초보자가 이해하고 읽는 것도 약간 더 쉽습니다.
정규식을 사용하는 동안 문자열 문자 “^”(캐럿 / 서 컴플렉스)의 시작 및 / 또는 문자열 문자 “$”(달러)의 끝을 입력하지 않으면 예상치 못한 / 직관적이지 않은 동작이 발생할 수 있습니다 (예 : ” 어제 “또는”왜 “).
옵션 주위에 그룹화 문자 “()”(괄호)를 넣으면 각 옵션에 대한 문자열 문자의 시작과 끝을 입력 할 필요가 줄어 듭니다. 그것들이 없으면 정규식에 정통하지 않으면 예기치 않은 동작이 발생할 수 있습니다. 물론 사용자 입력을 처리하지 않고 알려진 문자열 집합을 처리하는 경우 문자열 문자의 시작과 끝을 그룹화하지 않고 더 읽기 쉽습니다.
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." }
}
답변
스위치는 PowerShell 5.1에서 대소 문자를 구분하지 않는 것으로 보입니다. $someString
아래의 네 가지 예가 모두 작동합니다.
$someString = "YES"
$someString = "yes"
$someString = "yEs"
$someString = "y"
switch ($someString) {
{"y","yes"} { "You entered Yes." }
Default { "You didn't enter Yes."}
}
여기 내 $PSVersionTable
데이터가 있습니다.
Name Value
---- -----
PSVersion 5.1.17763.771
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.771
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1