110 votes

PowerShell: comment rechercher la sortie de la commande?

Dans PowerShell, j'ai essayé :

alias | select-string Alias

Cela échoue même si Alias est clairement dans la sortie. Je sais que c'est parce que select-string opère sur un objet et non sur la chaîne de sortie effective.

Que peut-on faire à ce sujet ?

122voto

Roi Points 135

Je pense que cette solution est plus facile et meilleure, utilise directement la fonction findstr:

alias | findstr -i Write

Vous pouvez également créer un alias pour utiliser le mot grep:

new-alias grep findstr

75voto

Mike Shepard Points 5109

Votre problème est que l'alias émet un flux d'objets AliasInfo, plutôt qu'un flux de chaînes. Ceci fait ce que je pense que vous voulez.

alias | out-string -stream | select-string Alias

ou en tant que fonction

function grep {
  $input | out-string -stream | select-string $args
}

alias | grep Alias

Lorsque vous ne gérez pas les éléments qui se trouvent dans le pipeline (comme lorsque vous venez d'exécuter 'alias'), l'interpréteur sait d'utiliser la méthode ToString() sur chaque objet (ou d'utiliser les formats de sortie spécifiés dans les informations ETS).

36voto

Keith Hill Points 73162

Si vous voulez vraiment "grep" la sortie formatée (chaînes d'affichage), alors suivez l'approche de Mike. Il y a définitivement des moments où cela est utile. Cependant, si vous voulez essayer d'embrasser la nature de l'objet pipeline de PowerShell, essayez ceci. Tout d'abord, vérifiez les propriétés des objets qui descendent dans le pipeline :

PS> alias | Get-Member

   TypeName: System.Management.Automation.AliasInfo

Name                MemberType     Definition
----                ----------     ----------
Equals              Method         bool Equals(System.Object obj)
GetHashCode         Method         int GetHashCode()
GetType             Method         type GetType()
ToString            Method         string ToString()

*Définition*        Property       System.String Definition {get;}

Remarquez la propriété Definition qui est un en-tête que vous voyez lorsque vous affichez la sortie de Get-Alias (alias) par exemple :

PS> alias

CommandType     Name           *Définition*
-----------     ----           ----------
Alias           %              ForEach-Object

Normalement, le titre de l'en-tête correspond au nom de la propriété mais pas toujours. C'est là que l'utilisation de Get-Member est utile. Cela vous montre ce dont vous avez besoin pour "scripter". Maintenant, si ce que vous voulez "grep" ce sont les contenus de la propriété Definition, envisagez ceci. Au lieu de simplement grep cette valeur de propriété, vous pouvez plutôt filtrer chaque objet AliasInfo dans le pipeline en fonction du contenu de cette propriété et vous pouvez utiliser une regex pour le faire par exemple :

PS> alias | Where-Object {$_.Definition -match 'alias'}

CommandType     Name                   Definition
-----------     ----                   ----------
Alias           epal                   Export-Alias
Alias           gal                    Get-Alias
Alias           ipal                   Import-Alias
Alias           nal                    New-Alias
Alias           sal                    Set-Alias

Dans cet exemple, j'utilise le cmdlet Where-Object pour filtrer les objets en fonction d'un script arbitraire. Dans ce cas, je filtre par la propriété Definition mise en correspondance avec la regex 'alias'. Seuls les objets qui retournent vrai pour ce filtre sont autorisés à se propager dans le pipeline et à être formatés pour l'affichage sur l'hôte.

Par ailleurs, si vous saisissez ceci, vous pouvez utiliser l'un des deux alias pour Where-Object - 'Where' ou '?'. Par exemple :

PS> gal | ?{$_.Definition -match '-Item*'}

16voto

Ian Kelling Points 1835

Il y a deux problèmes. Comme dans la question, select-string doit fonctionner sur la chaîne de sortie, qui peut être obtenue à partir de "out-string". De plus, select-string n'opère pas ligne par ligne sur les chaînes qui lui sont envoyées en tant que tube. Voici une solution générique

(alias|out-string) -split "`n" | select-string Écrire

5voto

mjsr Points 1781

La solution proposée demande juste trop de travail pour quelque chose qui peut être fait comme ceci :

Get-Alias -Definition Write*

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