PowerShell et l’opérateur -contains

Considérez l’extrait suivant:

"12-18" -Contains "-" 

Vous pensez que cela est true , mais ce n’est pas le cas. Cela sera évalué à false place. Je ne sais pas pourquoi cela se produit, mais c’est le cas.

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

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

Maintenant, l’expression sera évaluée à true.

Pourquoi le premier extrait de code se comporte-t-il comme ça? Y a-t-il quelque chose de spécial à propos de - qui ne joue pas bien avec -Contains ? La documentation ne mentionne rien à ce sujet.

L’opérateur -Contains ne fait pas de comparaisons de sous-chaînes et la correspondance doit être sur une chaîne complète et utilisée pour rechercher des collections.

De la documentation que vous avez liée à:

-Contains Description: Opérateur de confinement. Indique si une collection de valeurs de référence inclut 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 que vous avez liée, vous verrez un exemple qui illustre 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 l’opérateur -Match :

 "12-18" -Match "-" 

Qui renvoie True .

-Contains est en réalité un opérateur de collecte. C’est vrai si la collection contient l’object. Il ne se limite pas aux chaînes.

-match et -imatch sont des correspondances de chaînes d’expressions régulières et définissent des variables automatiques à utiliser avec les captures.

-ilike , -ilike sont des matchers de type SQL.

Vous pouvez utiliser like :

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

Ou split pour contains :

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