2010-04-20 18 views
16

Je suis un peu frustré par un petit script PowerShell que j'écris. Fondamentalement, je fais une boucle sur les fichiers texte pour vérifier chaque ligne par rapport à un tableau de modèles d'expression régulière. Le résultat est redirigé vers la cmdlet out-file qui l'ajoute à un autre fichier texte.Évitez les sauts de ligne lors de l'utilisation de fichiers externes

Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object { 
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 } 

Mon problème est que je ne peux pas sortir fichier d'omettre les lignes supplémentaires casse crée dans le fichier derrière csvpath de $ (trois après chaque ligne). Je pourrais utiliser des classes de framework .NET pour obtenir la même chose mais je préfère coller à PowerShell pur ;-)

Toute aide est grandement appréciée.

Kevin

+2

'foreach {Select-String -InputObject $ _}'? Pourquoi ne pas simplement rediriger 'Select-String' directement? – Joey

+0

Salut Johannes, pour être honnête, je ne sais pas comment cela pourrait aider. – bitfrickler

+0

Ce n'était pas une réponse à votre problème (d'où un commentaire à votre question et * pas * une réponse); juste une note de comment vous pourriez réduire l'encombrement dans votre commande là. – Joey

Répondre

9

Pourquoi ne pas utiliser Add-Content?

gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath 

Vous n'avez pas besoin de spécifier la largeur et -append commutateur, la taille du fichier est doublé par défaut (bien que vous pouvez spécifier l'encodage) et il semble qu'il n'y a pas de problème avec les lignes vides comme vous avez .

+0

Content de vous aider;) Cela fonctionne, mais en général, il peut être difficile de formater certains objets. Dans ce cas je devine 'ToString()' est appelée sur chaque objet 'MatchInfo'. Pour beaucoup d'autres types 'ToString()' renvoie juste un nom de type (aucune information utile). Ensuite, il est nécessaire comme Keith suggère de spécifier la propriété concrète. – stej

10

Gardez à l'esprit que les sorties Select-String MatchInfo objets et non des chaînes - comme le montre cette commande:

gci $logdir -r *.txt | gc | select-string $patterns | format-list * 

Vous demandez un rendu implicite de l'objet MatchInfo à chaîne avant d'être sorti dans un fichier. Pour une raison que je ne comprends pas, cela entraîne la production de lignes blanches supplémentaires. Vous pouvez corriger cela en spécifiant que vous souhaitez que la sortie de la propriété de ligne au fichier .: par exemple

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000