2017-07-04 3 views
2

J'essaye d'écrire un script PS simple pour vérifier les fichiers .txt de grande taille pour une chaîne courte: "SRVE0242I:"Select-String dans Powershell affichant uniquement une partie de la ligne d'un fichier texte, besoin de l'afficher

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String 

En sortie cependant, il affiche uniquement les éléments suivants:

ligne
[28/06/17 13: 48: 27: 839] 00000020 ServletWrappe Je SRVE0242I: [utilisateur] [utilisateur] [ com_xxxxxxx _...

Et pas la ligne complète. Y at-il une limite au nombre de caractères que cela tire? Je ne trouve aucune information sur les restrictions de la cmdlet Select-String. Y a-t-il une meilleure façon de faire ceci pour que je n'aie pas a) taper l'en-tête "Line" dans ma liste de lignes (Ne pas vraiment créer de formatage de table pour une sortie aussi simple) et b) obtenir toute la ligne quand je tire l'info?

Répondre

1

Il y a! Longue histoire courte, Select-Object fait la troncature ici. Voici une façon d'obtenir la première ligne non tronquée dans une sortie Select-String

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line 

Lorsque vous rencontrez quelque chose comme ça, vous pouvez décomposer les différentes étapes pour déterminer ce qui se passe par des choses de tuyauterie à Get-membres. Voici ce qui se passe dans le code ci-dessus:

Select-String <# args #> | Get-Member 

Select-String nous donne un objet MatchInfo, qui (comme vous avez déterminé correctement) a une propriété 'Line'. Lorsqu'il est exécuté seul, Select-String crachera toutes les informations que vous recherchez et ne le tronquera pas par défaut (au moins sur la version 6.0.0-beta). Il vous donne un tableau d'objets MatchInfo s'il trouve plusieurs correspondances, donc vous devez indexer dans ce tableau si vous voulez juste le premier (comme je l'ai fait ci-dessus).

Select-String <# args #> | Select-Object Line | Get-Member 

Select-Object applique par défaut de PowerShell mise en forme pour les objets qui, dans la plupart des cas, tronque votre sortie pour faciliter la visualisation. Pour les objets avec un groupe de membres (comme un objet MatchInfo), il essayera d'en faire un par ligne par défaut.

Select-String <# args #> | Select-Object Line | Out-String | Get-Member 

Out-String directement traduit son entrée à une chaîne. C'est-à-dire, plutôt que d'essayer de transtyper quelque chose dans une chaîne ou de tirer une propriété de chaîne d'un objet qui lui est passé, elle change simplement ce qu'elle reçoit dans un objet. Dans ce cas, il transforme la sortie MatchInfo déjà formatée en chaîne. Rien n'arrive à la sortie sur le terminal, mais Get-Member révélera une chaîne plutôt qu'un objet MatchInfo.

Ce n'est pas directement pertinent ici, mais si vous êtes intéressé par la modification de la mise en forme par défaut, il est régi par le fichier types.ps1xml.

2

Vous voyez cela comme cela, car il affiche la propriété Line en utilisant la vue Format-Table par défaut et en la raccourcissant à la largeur de la console.

Pour ce faire, à la place:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line 

Ce retourne la valeur de la propriété Line comme une chaîne à la variable $lines. Vous n'avez pas besoin d'utiliser Out-String.