web-dev-qa-db-fra.com

PowerShell et l'opérateur -contains

Considérez l'extrait suivant:

"12-18" -Contains "-"

Vous penserez que cela donne true, mais ce n’est pas le cas. Ceci sera évalué à false à la place. Je ne sais pas pourquoi cela se produit, mais ça arrive.

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

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

Maintenant, l'expression sera évaluée comme vraie.

Pourquoi le premier extrait de code se comporte-t-il de la sorte? y a-t-il quelque chose de spécial à propos de - qui ne fonctionne pas bien avec -Contains? Le documentation ne mentionne rien à ce sujet.

106
tnw

L'opérateur _-Contains_ ne fait pas de comparaisons de sous-chaînes et la correspondance doit figurer sur une chaîne complète et est utilisée pour rechercher des collections.

À partir de la documentation que vous avez liée à:

-Contains 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 un seul élément de chaîne.

Si vous lisez la documentation à laquelle vous avez accédé, vous verrez un exemple illustrant ce problème:

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 l'opérateur -Match :

_"12-18" -Match "-"
_

Ce qui retourne True.

Important: Comme indiqué dans les commentaires et dans la documentation liée , il convient de noter que le _-Match_ L’opérateur utilise expressions régulières pour effectuer une correspondance de texte.

149
Kev

_-Contains_ est en fait un opérateur de collection. C'est vrai si la collection contient l'objet. Cela ne se limite pas aux chaînes.

-match_ ET _-imatch sont des correspondeurs de chaîne d'expression régulière et définissent des variables automatiques à utiliser avec les captures.

_-like_, _-ilike_ sont des correspondants de type SQL.

35
Eris

Vous pouvez utiliser like:

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

Ou split pour contains:

"12-18" -split "" -contains "-"
8
Esperento57
  • like est le meilleur, ou du moins le plus facile.
  • match est utilisé pour les comparaisons de regex.

Référence: https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_comparison_operators?view=powershell-6

0
Maximojo