Filtre à la sortie d'une commande comme si c'était un texte
J'ai une question simple, mais je suis aussi un débutant en PowerShell. Je pense que cela a à voir avec le fait que la sortie de la ps commandes sont des objets et non du texte.
Ce que je veux faire est d'obtenir une liste des services en cours d'exécution qui ont le nom "sql" dans les.
C'est ce que j'ai essayé jusqu'à présent, mais à chaque tentative ne retourne rien:
get-service | where {$_ -match 'sql'}
get-service | where {$_ -like 'sql'}
get-service | select-string sql
Je suis à la recherche d'un modèle qui me permet de traiter la sortie de chaque commande en tant que recherche de texte.
OriginalL'auteur buckley | 2011-07-09
Vous devez vous connecter pour publier un commentaire.
Les autres réponses sont bien sûr au sujet de votre question spécifique du démarrage des services qui ont "sql" dans leur nom, mais pour répondre à la question générique:
Vous pouvez faire
get-service | out-string
et vous obtiendrez la sortie sous forme de chaîne de caractères, un peu comme la façon dont les commandes Unix de travail.Également lorsque la sortie est redirigée vers la non-commandes powershell, il est converti en texte, donc par exemple:
get-service | grep sql
fonctionne de la manière que vous vouliez.Mais encore une fois, comme @JPBlanc dit, il est bon d'embrasser la façon Powershell fonctionne, qui est que les sorties sont des objets. Il vous donne beaucoup plus de contrôle et garde les choses simples et lisibles ( les commandes Unix sed, awk et ce qui ne fonctionne pas sur le texte de sortie des autres sorties de commande peut être très énigmatique! )
La seule chose à surveiller de l'extérieur de la Chaîne, c'est qu'il tronque à 80 caractères par défaut. Normalement, je ne blah | -Chaîne -Largeur 1 ko ou -Largeur de 10 ko pour éviter cela.
OriginalL'auteur manojlds
Vous travaillez trop dur:
Pour être clair, lors de la recherche d'un service spécifique de votre approche fait beaucoup plus de sens. Mais si la question est "comment faire pour rechercher la sortie comme si elle l'endroit où le texte" il n'aura pas les résultats escomptés. Je ne vais pas downvote parce que c'est une précieuse réponse, et peut avoir été ce que l'OP est vraiment à la recherche pour.
OriginalL'auteur mjolinor
Tom 'OUBLIER' :o)
Les sorties SONT les objets que vous sont à droite, et vous allez utiliser cela.
Donc @mjolinor a la réponse la plus courte, mais pour votre information, il suffit de tester :
De sorte que vous comprendrez que
fonctionne aussi, et là vous avez votre texte comme une PROPRIÉTÉ de l'objet
OriginalL'auteur JPBlanc
Cela fonctionne comme grep. Et vous pouvez même trier
OriginalL'auteur Stephen Lester
Plus de réponses ici, l'accent sur la recherche au service de nom "sql" dans le nom, pas sur le filtrage l'ensemble de la sortie comme si c'était un texte. Aussi, l'on a accepté la réponse utilise non-powershell fonction "findstr".
Alors, d'accord, ce qui suit n'est pas la solution la plus élégante, mais un souci d'exhaustivité, j'aimerais faire le 100% PowerShell solution que prend la question de l'OP littéralement:
Out-String
car en utilisant les solutions fournies dans les autres réponses ne veut pas de nous fournir le texte complet de la sortie de la commande Get-Service, seule laName
paramètre.C'est un puriste de réponse, et dans la pratique, pour ce cas d'utilisation, je ne le recommanderais pas. Mais pour les gens qui arrivent ici par le biais de google basé sur la question du titre, c'est une réponse plus précise...
Vous pouvez tester cela en les supprimant. Ensuite, vous trouverez que la suppression de parenthèses provoque le paramètre split pour être appliqué directement sur la Chaîne de l'applet de commande, et de ne pas le résultat de (get-Service | Hors-Chaîne).
Aussi, il est de coutume de upvote réponses sur StackExchange que vous trouvez utile.
OriginalL'auteur Wouter
Que le texte de ce nom est une propriété de l'objet est importante pour obtenir autour de votre tête, et comment utiliser les valeurs de propriété dans le filtre.
Un autre aspect de Powershell, vous pouvez l'effet de levier pour résoudre ce problème consiste à sélectionner les propriétés des objets avec select-object:
vous obtiendrez un tableau de chaîne avec les noms des serveurs, et de deux de vos trois filtres de travailler sur des que. L'-like n'est pas d'aller travailler, car il n'y a pas de caractères génériques dans la chaîne de test. La seule chose qu'il ne sera jamais correspondre est juste 'sql'.
Je crois toujours que la première solution que j'ai posté est le meilleur. Il est important de savoir comment faire la fin de filtrage, mais aussi comment l'utiliser dès le début de filtrage quand vous le pouvez.
OriginalL'auteur mjolinor
Si quelqu'un veut plus d'informations sur les opérations logiques, consultez http://technet.microsoft.com/en-us/library/ee177028.aspx
-lt -- Moins de
•
-le -- inférieure ou égale à
•
-gt, Plus grand que
•
-ge, Plus grand que ou égal à
•
-eq -- Égale à
•
-ne-Pas égal à
•
-comme - comme; utilise des caractères génériques pour la correspondance de motif
get-service | where {$_ -match 'sql'} would be get-service | where {$_ -eq "sql"}
get-service | where {$_ -like 'sql'} would be get-service | where {$_ -like "sql"}
Et maintenant un exemple réel.
PS C:\> Get-Service | where {$_.name -like "net*"}
Status Name DisplayName
------ ---- -----------
Running Net Driver HPZ12 Net Driver HPZ12
Running Netlogon Netlogon
OriginalL'auteur maxflipz
Vous voulez probablement à ceci:
Ce que nous faisons ici, c'est aller si chaque propriété d'un objet pour voir si elle correspond au modèle donné. Si l'objet contient une ou plusieurs de ces propriétés, nous l'écrire. Résultat final: grep par toutes les propriétés d'un objet.
Mettre dans vos fichiers de configuration et de grep au contenu de votre coeur.
OriginalL'auteur Marty Gentillon