Прокрутка файлов в каталоге с помощью 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 в свой системный путь.