230 votes

PowerShell et l'opérateur -contains

Prenons l'exemple suivant :

"12-18" -Contains "-"

On pourrait penser qu'il s'agit d'une évaluation de true mais ce n'est pas le cas. L'évaluation sera de false au lieu de cela. Je ne sais pas exactement pourquoi cela se produit, mais c'est le cas.

Pour éviter cela, vous pouvez utiliser ceci à la place :

"12-18".Contains("-")

L'expression est maintenant évaluée à true.

Pourquoi le premier extrait de code se comporte-t-il ainsi ? Y a-t-il quelque chose de spécial à propos de - qui ne fait pas bon ménage avec -Contains ? La documentation ne mentionne rien à ce sujet.

303voto

Kev Points 60744

En -Contains n'effectue pas de comparaisons de sous-chaînes et la correspondance doit porter sur une chaîne complète ; il est utilisé pour rechercher des collections.

D'après la documentation à laquelle vous avez fait référence :

- Description : Opérateur de confinement. Indique si une collection de valeurs de référence comprend une seule valeur de test.

Dans l'exemple que vous avez fourni, vous travaillez avec une collection contenant une seule chaîne de caractères.

Si vous lisez la documentation à laquelle vous avez renvoyé, vous verrez un exemple qui démontre ce comportement :

Exemples :

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

Je pense que ce que vous voulez, c'est la -Match de l'opérateur :

"12-18" -Match "-"

Qui renvoie True .

Important : Comme indiqué dans les commentaires et dans le documentation liée il convient de noter que la -Match l'opérateur utilise expressions régulières pour effectuer une recherche de texte.

50voto

Eris Points 1902

-Contains est en fait un opérateur de collection. Il est vrai si la collection contient l'objet. Il n'est pas limité aux chaînes de caractères.

-match y -imatch sont des outils de comparaison d'expressions régulières, et définissent des variables automatiques à utiliser avec les captures.

-like , -ilike sont des outils d'appariement de type SQL.

35voto

Esperento57 Points 8045

Vous pouvez utiliser like :

"12-18" -like "*-*"

Ou split para contains :

"12-18" -split "" -contains "-"

2voto

Maximojo Points 306
  • like est la meilleure, ou du moins la plus facile.
  • match est utilisé pour les comparaisons d'expressions rationnelles.

Référence : _À propos des opérateurs de comparaison_

Prograide.com

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.

Powered by:

X