Прокрутка файлов в каталоге с помощью PowerShell

Как я могу изменить следующий код, чтобы посмотреть все файлы .log в каталоге, а не только один файл?

Мне нужно перебрать все файлы и удалить все строки, которые не содержат "step4" или "step9". В настоящее время это создаст новый файл, но я не уверен, как использовать цикл for each здесь (новичок).

Фактические файлы называются такими: 2013 09 03 00_01_29.log. Я бы хотел, чтобы выходные файлы либо перезаписывали их, либо имели одно имя, добавленное с "out".

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out

Ответ 1

Попробуйте:

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')
}

Ответ 2

Чтобы получить содержимое каталога, вы можете использовать

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

Ответ 3

Если вам нужно циклически перебирать директорию для определенного типа файла, используйте приведенную ниже команду, которая фильтрует все файлы типа doc типа

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

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

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

Теперь переменная $fileNames действует как массив , из которой вы можете циклически и применять свою бизнес-логику.

Ответ 4

Другие ответы велики, я просто хочу добавить... другой подход, который можно использовать в 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 в свой системный путь.