2017-02-22 4 views
0

Ich möchte Inhalte aus Dateien in einem Ordner (ignorieren die Kopfzeilen, da einige Datei möglicherweise nur die Kopfzeile enthalten). Aber in der Ausgabe möchte ich den Dateinamen angeben, von dem die Zeile gelesen wird. Bisher habe ich folgendes:Include Dateiname in der Ausgabe

Get-ChildItem | Get-Content | Where { $_ -notlike "HEADER_LINE_TEXT" } | Out-File -FilePath output_text.txt

Ich habe versucht, mit dem Erstellen einer Variable im Block Wo zu arbeiten, $filename=$_.BaseName, und es in der Ausgabe verwenden, aber das hat nicht funktioniert.

EDIT:

ich mit folgendem endete:

Get-ChildItem -Path . | Where-Object { $_.FullName -like "*records.txt"; $fname=$_FullName; } | Get-Content | Select-Object { ($fname + "|" + $_.Trim()) } | Where { $_ -notlike "*HEADER_LINE_TEXT*" } | Format-Table -HideTableHeaders | Out-File -FilePath output_text.txt

Das sieht langwierig und kann wahrscheinlich kürzer und klarer gemacht werden. Kann mir jemand helfen, das etwas aufzuräumen? Ich poste entweder die Lösung oder stimme für eine sauberere Lösung, wenn eine gepostet wird. Vielen Dank.

Antwort

1

Das sieht nach einem Fall aus, in dem es besser lesbar wäre, es nicht zu einem einzigen Liner zu machen, wenn es um ein wenig zusätzlichen Speicherverbrauch geht.

$InputFolder = "C:\example" 
$OutputFile = "C:\example\output_text.txt" 
$Files = Get-ChildItem $InputFolder | Where-Object { $_.FullName -like "*records.txt"} 
Foreach ($File in $Files) { 
    $FilteredContent = Get-Content $File.FullName | Where-Object {$_ -notlike "*HEADER_LINE_TEXT*"} 
    $Output = $FilteredContent | Foreach-Object { "$($File.FullName)|$($_.Trim())" } 
    $Output | Out-File $OutputFile -Append 
} 

Wenn Sie oneliner Stil der Kürze halber gehen werden, können Sie auf Länge geschnitten von Position für Parameter und Aliase.

Hier sind ein paar andere Änderungen:

  • Keine Notwendigkeit für das zweite Semikolon in Ihrem ersten where Block.
  • Ich glaube, Ihre Variable hat nicht funktioniert, weil Sie den Zeitraum zwischen $_ und fullname fehlten.
  • Format-Table nicht, weil Sie schon benötigt wird, um die Zeichenfolge haben Sie
  • Sie ausgeben möchten früher ein wenig durch die zweite where bewegen optimieren, so dass Sie dies nicht tun trim() auf Linien werden Sie nur
  • filtern sieht aus wie Sie foreach statt select
  • entfernt die + Operator für die String-Verkettung verwenden möchten, anstatt $() mit in Klammern
bewerten
 
gci . | 
    ? { $_.FullName -like "*records.txt"; $fname=$_.FullName } | 
    % { gc $_.FullName } | 
    ? { $_ -notlike "*HEADER_LINE_TEXT*" } | 
    % { "$fname|$($_.Trim())" } | 
    Out-File output_text.txt 
+0

Danke, @BenH. Ich wollte es nicht wirklich als eine einzige Linie behalten. Ihre vorgeschlagene Lösung im ersten Codeblock hat für mich funktioniert. –

+1

Beide Ansätze funktionieren und haben Vor-/Nachteile. Aber ich stimme zu, dass der erste Ansatz das ist, was ich verwenden würde, weil ich der Lesbarkeit und der einfachen Modifikation Vorrang gebe, wann immer es sinnvoll ist. Froh, es hat geklappt:) – BenH