2
votes

Où comme "*" dans PowerShell

J'ai une liste de chaînes et certaines d'entre elles commencent par "*" par exemple: "* ThisIsAString", "* Ceci est aussi une chaîne".

Je voudrais utiliser une clause where pour sélectionner uniquement les chaînes commençant par "*" mais, comme * est le caractère utilisé pour spécifier, continuer jusqu'à la fin de la chaîne - j'ai du mal.

Voici ce que j'essaie de faire, en quelque sorte: Where-Object {$ _. DisplayName -like "*"}

Je suis sûr que c'est possible, mais je n'ai pas trouvé de moyen de le faire après quelques recherches en ligne!


2 commentaires

$ _. DisplayName -comme '[*] *' ou $ _. DisplayName.StartsWith ('*') .


@GertJanKraaijeveld: Oui, mais notez que ce n'est pas un échappement qui est utilisé, c'est un jeu de plage / de caractères ; le vrai échappement fonctionne aussi: '* foo' -like '`* *'


3 Réponses :


2
votes
$_.DisplayName.StartsWith('* ')

4 commentaires

@AnsgarWiechers Ai-je raison de dire que cela fonctionne, car à l'intérieur d'un Range les caractères génériques sont pris littéralement?


@LotPings: Oui, mais notez que - même si la documentation l'appelle ainsi - [...] n'est pas simplement une plage , sans - , vous pouvez placer des caractères les uns à côté des autres pour les interpréter comme un ensemble afin que tout caractère individuel corresponde; par exemple. 'whoa' - comme 'wh [ao] [oa]'


@ mklement0 Oui, je suis conscient que la plage / l'ensemble est comparable à Classes de caractères RegEx ou jeux de caractères juste sans négations ni quantificateurs. Je voulais expliquer pourquoi cela fonctionne.


@LotPings: Heureux de l'entendre, mais suggérez que si vous voulez souligner quelque chose que vous savez déjà être vrai , ne l'exprimez pas comme une question .



2
votes

Une autre façon de faire est une regex -match :

PS> $strings='* one','two','* three'
PS> $strings.Where({$_ -match  '^\* '})
* one
* three


1 commentaires

Merci (+1) - J'ai supprimé mon commentaire précédent (et je vais supprimer celui-ci).



0
votes

Votre propre réponse basée sur les commentaires utiles d'Ansgar Wiecher et L'alternative utile de Gert Jan Kraaijeveld fournit toutes deux des solutions efficaces.

La solution la plus immédiate consiste à échapper le caractère * . dans votre expression générique, ce qui peut être fait avec un backtick ( `), mais notez qu'il doit être placé dans une chaîne guillemets simples ( '...' ):

PS> '* foo' -like '`* *'  
True


0 commentaires