2017-02-22 6 views
0

Я хотел бы получить контент из файлов в папке (игнорируя строки заголовка, так как в некотором файле может быть ТОЛЬКО содержит заголовок). Но на выходе я хотел бы указать имя файла, из которого читается строка. До сих пор у меня есть следующие:Включить имя файла на выходе

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

Я пытался работать с созданием переменной в блоке Где, $filename=$_.BaseName, и использовать его на выходе, но это не сработало.

EDIT:

Я закончил с следующее:

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

Это выглядит длительным, и, вероятно, может быть короче и яснее. Может кто-нибудь помочь с его очисткой? Я либо отправлю решение, либо проголосую за более чистое решение, если оно опубликовано. Благодарю.

ответ

1

Это выглядит так, чтобы сделать его более читаемым, чтобы не сделать его одним лайнером при стоимости небольшого дополнительного использования памяти.

$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 
} 

Если вы собираетесь идти Oneliner стиль для краткости, можно сократить длину, используя позицию для параметров и использование псевдонимов.

Вот несколько других изменений:

  • Нет необходимости во второй точкой с запятой в первом where блоке.
  • Я думаю, что ваша переменная не работала, потому что вам не хватало период между $_ и fullname.
  • Format-Table не нужен, потому что у вас уже есть строка, которую вы хотите вывести
  • Вы можете оптимизировать немного, перемещая второй where раньше, так что вы не trim() на линии вы только собираетесь фильтровать
  • Похоже, вы хотите использовать foreach вместо select
  • Удалены + для конкатенации, используя вместо этого $() оценить в круглых скобках
 
gci . | 
    ? { $_.FullName -like "*records.txt"; $fname=$_.FullName } | 
    % { gc $_.FullName } | 
    ? { $_ -notlike "*HEADER_LINE_TEXT*" } | 
    % { "$fname|$($_.Trim())" } | 
    Out-File output_text.txt 
+0

Спасибо, @BenH. Я действительно не хотел держать его как одну линию. Ваше предложенное решение в первом блоке кода работало для меня. –

+1

Оба подхода работают, и имеют плюсы и минусы. Но я согласен с тем, что первый подход - это то, что я буду использовать, потому что я уделяю приоритетное внимание читабельности и легкой модификации всякий раз, когда это разумно. Рад, что это сработало:) – BenH

Смежные вопросы