스위치 문의 여러 값에 대한 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
는 시험할 합니다.-eq
operator,및 「」를 가지는 .-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
'programing' 카테고리의 다른 글
Xcode 8은 프로비저닝 프로파일에 서명 인증서가 포함되어 있지 않다는 오류를 나타냅니다. (0) | 2023.04.22 |
---|---|
SQL과 빈 문자열의 병합 (0) | 2023.04.22 |
Outlook에서 첨부 파일을 다운로드하여 Excel로 열기 (0) | 2023.04.22 |
출력을 변수로 업데이트 (0) | 2023.04.22 |
ASP를 사용하는 가장 큰 장점.넷 MVC 대 웹 폼 (0) | 2023.04.22 |