PowerShell: comment grep 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 fonctionne sur un objet et non la chaîne de sortie.
Ce qui peut être fait à ce sujet?
Vous devez vous connecter pour publier un commentaire.
Je pense que cette solution est plus facile et mieux, utiliser directement la fonction findstr:
Vous pouvez aussi faire un alias pour l'utilisation de grep mot:
-i
. Si vous montrez de l'aide pour findstr avecfindstr /?
il indiquera toutes les options précédés d'une barre oblique/
. Cependant, il va accepter des arguments, précédées d'une/
OU un-'. For example
ipconfig /all " est fonctionnellement identique àipconfig -all
. Donc-i
est le même que/i
et depuis findstr est un vieux programme DOS, et de vieux programmes DOS ne se soucient pas de cas,/i
est idential à/I
. Donc, cela signifie que c'est un cas insesitive de recherche.Write
à la fin.alias
est un alias pourGet-Alias
, qui est une applet de commande PowerShell. etWrite
est en fait la chaîne de recherche en cours, PAS l'alias deWrite-Output
que j'ai pensé d'abord à cause de la couleur et de la mise en forme indiquant une commande PowerShell. Je pensais queWrite-Output
a été remplacé en place pour findstr pour effectuer la recherche. Il n'est pas. Donc ce qui se passe réellement est que chaque ligne deGet-Alias
est transmise à findstr et qui va chercher les canalisations de str pour un cas insesitive match de la recherche du mot "Écrire".Votre problème, c'est que alias émet un flux de AliasInfo des objets, plutôt qu'un
flux de chaînes de caractères. Ce n'est que je pense que vous voulez.
ou comme une fonction
Lorsque vous n'avez pas gérer les choses qui sont dans le pipeline
(comme quand vous venez a couru "alias"), le shell sait utiliser la méthode ToString()
sur chaque objet (ou d'utiliser les formats de sortie spécifié dans l'ETS info).
Si vous voulez vraiment un "grep" la sortie au format d'affichage (chaînes de caractères), puis aller avec Mike approche. Il y a certainement des moments où c'est très pratique. Cependant, si vous voulez essayer d'embrasser PowerShell du pipeline de l'objet de la nature, alors essayez celui-ci. Tout d'abord, vérifier les propriétés sur les objets circulant dans le pipeline:
Noter la Définition de la propriété qui est un en-tête que vous voyez lorsque vous affichez la sortie de Get-Alias (alias), par exemple:
Généralement l'en-tête de titre correspond au nom de la propriété, mais pas toujours. C'est là que l'utilisation de Get-Membre vient dans maniable. Il vous montre ce que vous avez besoin de "script" contre. Maintenant, si ce que vous voulez "grep" est la Définition de la propriété contenu considérez ceci. Plutôt que de simplement grepping qu'une valeur de la propriété, vous pouvez à la place du filtre chaque AliasInfo objet dans le pipepline par le contenu de ce bien et vous pouvez utiliser une expression régulière pour le faire par exemple:
Dans cet exemple, j'ai utiliser la cmdlet where-Object pour filtrer les objets sur la base arbitraire d'un script. Dans ce cas, je filtre par la Définition de la propriété en correspondance avec les regex 'alias'. Uniquement les objets qui renvoie true pour que le filtre sont autorisés à se propager vers le bas le pipeline et obtenir mis en forme pour l'affichage sur l'ordinateur hôte.
BTW, si vous êtes en train de taper ceci, alors vous pouvez utiliser l'une des deux alias pour where-Object - 'Où' ou '?'. Par exemple:
findstr
où PowerShell poignée de conversion de texte pour vous, car il n'est pas une applet de commande mais un programme (juste à la sortie de la perfection; en général, il est toujours mieux de filtre en fonction de propriétés, à mon humble avis :-))gal | Where Definition -match 'alias'
Il y a deux problèmes. Comme dans la question, sélectionnez-la chaîne a besoin pour fonctionner sur la chaîne de sortie, qui peut être de type "string". Aussi, sélectionnez-la chaîne ne fonctionne pas linewise sur des chaînes qui sont dirigés vers elle. Voici une solution générique
Get-Member
et ensuite utiliser la propriété correcte et d'expression dans lewhere
de commande. Etgrep
est particulièrement bon dans celui-ci.-Stream
paramètre surOut-String
et puis vous pouvez transférer directement de Select-String.La solution proposée est juste beaucoup de travail pour quelque chose qui peut être fait comme ceci:
Pour plus de souplesse et de paresseux solution, vous pouvez faire correspondre toutes les propriétés des objets. La plupart du temps, cela devrait vous obtenez le comportement que vous voulez, et vous pouvez toujours être plus précis, quand il ne l'est pas. Voici un grep fonction qui fonctionne sur ce principe: