Перебрать файлы в каталоге с помощью 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
843   4  

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

    Ничего не найдено.