Перебрать файлы в каталоге с помощью PowerShell
Как я могу изменить следующий код, чтобы посмотреть на все .файлы журнала в каталоге, а не только один файл?
мне нужно перебрать все файлы и удалить все строки, которые не содержат "step4" или "step9". В настоящее время это создаст новый файл, но я не уверен, как использовать for each петли здесь (новичок).
сами файлы называются так: 2013 09 03 00_01_29.журнал. Я бы хотел, чтобы выходные файлы либо перезаписывали их, либо имели то же самое имя, добавленное с "out".
$In = "C:UsersgerhardlDocumentsMy Received FilesTest_In.log"
$Out = "C:UsersgerhardlDocumentsMy Received FilesTest_Out.log"
$Files = "C:UsersgerhardlDocumentsMy Received Files"
Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out
4 ответов:
дайте этому попытку:
Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | Foreach-Object { $content = Get-Content $_.FullName #filter and save content to the original file $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName #filter and save content to a new file $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log') }
чтобы получить содержимое каталога, вы можете использовать
$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"тогда вы также можете перебирать эту переменную:
for ($i=0; $i -lt $files.Count; $i++) { $outfile = $files[$i].FullName + "out" Get-Content $files[$i].FullName | Where-Object { !($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile }
Если вам нужно сделать цикл внутри каталога рекурсивно для определенного типа файлов, используйте следующую команду, которая фильтрует все файлы
docтип файла
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.docЕсли вам нужно выполнить фильтрацию по нескольким типам, используйте следующую команду.
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdfтеперь
$fileNamesпеременная действует как массив из которого вы можете цикл и применить свою бизнес-логику.
другие ответы отличные, я просто хочу добавить... другой подход, используемый в PowerShell: Установите GNUWin32 utils и используйте grep для просмотра строк / перенаправления вывода в файл http://gnuwin32.sourceforge.net/
Это перезаписывает новый файл каждый раз:
grep "step[49]" logIn.log > logOut.logэто добавляет вывод журнала, в случае, если вы перезаписываете файл входа и хотите сохранить данные:
grep "step[49]" logIn.log >> logOut.logПримечание: чтобы иметь возможность использовать GNUWin32 utils глобально, вы должны добавить папку bin в Path системы.
Comments