Я в основному хочу зробити це:
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." }
}
{ "y", "yes" -contains $_ }
І це також не враховує регістр, тому „ТАК” та „ТАК” тощо, також працюють.
switch
замовчуванням також не враховує регістр.
Я виявив, що це працює і здається більш читабельним:
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: Використання виписки про комутатор
ToLower()
оскільки рівність рядків не враховує регістр за замовчуванням у PowerShell.
switch($someString.ToLower())
{
"yes" { $_ = "y" }
"y" { "You entered Yes." }
default { "You entered No." }
}
Ви можете довільно розгалужувати, каскадувати та зливати справи таким чином, доки цільовий регістр знаходиться нижче / після справи або випадків, коли змінна $ _ відповідно перепризначена.
nb Настільки ж милою, як така поведінка, здається, виявляється, що інтерпретатор PowerShell не реалізує перемикач / корпус настільки ефективно, як можна було б сподіватися чи припускати. З одного боку, використання налагоджувача ISE передбачає, що замість оптимізованого пошуку, хешування або двійкового розгалуження кожен випадок перевіряється по черзі, як і багато інших операторів if-else. (Якщо це так, спробуйте поставити найпоширеніші випадки на перше місце.) Крім того, як показано у цій відповіді, PowerShell продовжує тестування випадків після того, як їх задовольнив. І досить жорстоко, навіть буває спеціальний оптимізований код перемикання, доступний у .NET CIL, яким через таку поведінку PowerShell не може скористатися.
Підтримує введення y | ye | yes та не враховує регістр.
switch -regex ($someString.ToLower()) {
"^y(es?)?$" {
"You entered Yes."
}
default { "You entered No." }
}
Невелика модифікація поста derekerdmann для задоволення вихідного запиту за допомогою оператора чергування регулярного виразу "|" (труба).
Також новачкам регулярних статей легше розуміти та читати.
Зауважте, що під час використання регулярного виразу, якщо ви не ставите початок рядкового символу "^" (caret / circumflex) та / або кінець рядкового символу "$" (долар), ви можете отримати несподівану / неінтуїтивну поведінку (наприклад, відповідність " вчора "або" чому ").
Розміщення символів групування "()" (дужки) навколо параметрів зменшує необхідність розміщувати початок і кінець рядкових символів для кожного варіанту. Без них ви отримаєте, можливо, несподівану поведінку, якщо ви не підковані з регулярним виразом. Звичайно, якщо ви не обробляєте введені користувачем дані, а скоріше деякий набір відомих рядків, він буде більш читабельним без групування та початку та кінця символів рядка.
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
Після пошуку рішення тієї ж проблеми, що і ви, я знайшов тут цю невеличку тему. Заздалегідь я отримав набагато більш плавне рішення для цього перемикача, виклад справи
switch($someString) #switch is caseINsensitive, so you don't need to lower
{
{ 'y' -or 'yes' } { "You entered Yes." }
default { "You entered No." }
}
{$_ -in "y","yes"}
але я не впевнений, з якої версії PS.