Je veux essentiellement faire ça :
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
Je veux essentiellement faire ça :
switch($someString.ToLower())
{
"y", "yes" { "You entered Yes." }
default { "You entered No." }
}
Peut également faire {$_ -in "y","yes"}
mais je ne suis pas sûr depuis quelle version de PS.
-eq est insensible à la casse lors de la comparaison de chaînes de caractères, donc ToLower n'est pas nécessaire.
J'ai trouvé que cela fonctionne et semble plus lisible :
switch($someString)
{
{ @("y", "yes") -contains $_ } { "You entered Yes." }
default { "You entered No." }
}
L'opérateur "-contains" effectue une recherche non sensible à la casse, de sorte que vous n'avez pas besoin d'utiliser "ToLower()". Si vous voulez que la recherche soit sensible à la casse, vous pouvez utiliser "-ccontains" à la place.
Vous devriez pouvoir utiliser un joker pour vos valeurs :
switch -wildcard ($someString.ToLower())
{
"y*" { "You entered Yes." }
default { "You entered No." }
}
Les expressions régulières sont également autorisées.
switch -regex ($someString.ToLower())
{
"y(es)?" { "You entered Yes." }
default { "You entered No." }
}
Documentation sur les commutateurs PowerShell : Utilisation de l'instruction Switch
C'est une excellente solution, bien que "techniquement", puisque je demandais d'utiliser des valeurs séparées, j'ai marqué fletcher comme étant la réponse.
C'est juste, bien qu'une expression régulière différente pourrait probablement faire la même chose.
switch($someString.ToLower())
{
"yes" { $_ = "y" }
"y" { "You entered Yes." }
default { "You entered No." }
}
Vous pouvez arbitrairement faire des branchements, des cascades et des fusions de cas de cette manière, à condition que le cas cible soit localisé. ci-dessous/après le ou les cas où la variable $_ est respectivement réaffectée.
n.b. Aussi mignon que soit ce comportement, il semble révéler que l'interpréteur PowerShell n'implémente pas switch/case aussi efficacement qu'on pourrait l'espérer ou le supposer. Pour commencer, l'utilisation du débogueur ISE suggère qu'au lieu d'une recherche optimisée, d'un hachage ou d'un branchement binaire, chaque cas est testé tour à tour, comme autant d'instructions if-else. (Si c'est le cas, pensez à mettre vos cas les plus courants en premier). De plus, comme le montre cette réponse, PowerShell continue de tester les cas après en avoir satisfait un. Et cruellement, il existe même un opcode spécial optimisé 'switch' disponible dans le CIL de .NET dont, à cause de ce comportement, PowerShell ne peut pas profiter.
Ce n'est pas mignon - c'est documenté. Ajoutez une instruction break si vous ne voulez pas que les branches suivantes soient évaluées.
Une légère modification du message de derekerdmann pour répondre à la demande originale en utilisant l'opérateur d'alternance "|" (pipe) de regex.
Il est également un peu plus facile à comprendre et à lire pour les novices en matière de regex.
Notez que lorsque vous utilisez une expression rationnelle, si vous ne mettez pas le début du caractère de chaîne "^" (caret/circumflex) et/ou la fin du caractère de chaîne "$" (dollar), vous risquez d'obtenir un comportement inattendu/intuitif (comme la correspondance avec "hier" ou "pourquoi").
Le fait de placer des caractères de regroupement "()" (parenthèses) autour des options réduit la nécessité de mettre des caractères de début et de fin de chaîne pour chaque option. Sans eux, vous obtiendrez un comportement inattendu si vous n'êtes pas un expert en regex. Bien sûr, si vous ne traitez pas l'entrée de l'utilisateur, mais plutôt un ensemble de chaînes de caractères connues, ce sera plus lisible sans regroupement et sans caractères de début et de fin de chaîne.
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." }
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.