Создание исполняемого процесса, который определяет, какие файлы .txt в папке содержат определенный текст

Создание исполняемого процесса, который определяет, какие файлы .txt в папке содержат определенный текст

Моя операционная система — Windows 10.

У меня есть папка, содержащая один или несколько файлов .txt. Внутри каждого файла есть строки, отформатированные следующим образом:

2016-12-07 14:08:43 7.7 б=123 г=890

Я хочу создать воспроизводимый процесс, который я смогу выполнить, чтобы просмотреть все файлы в папке и предоставить мне имена файлов в файле .txt всех файлов, которые содержат 6.7дату более семи дней назад.

Пример сценария:

Файл1 содержит:2016-12-07 14:08:43 7.7 b=123 r=890

Файл2 содержит:2017-01-24 14:08:43 7.7 b=123 r=890

Файл3 содержит:2017-01-23 14:08:43 6.7 b=123 r=890

Я запускаю процесс и получаю файл .txt, содержащий:File3

Я не знаю, можно ли это сделать с помощью командной строки, PowerShell или для выполнения этой задачи потребуются полноценные усилия разработчиков.

решение1

Следующий скрипт PowerShell

Get-ChildItem *.txt -Recurse |
    ForEach-Object { 
        $aux=$_
        Get-Content "$aux" | 
            ForEach-Object {
                if ($_ -match '6\.7') {
                    if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {
                        $aux.FullName
                    }
                }
            }
    }

или эквивалентный однострочник

Get-ChildItem *.txt -Recurse | ForEach-Object { $aux=$_; Get-Content "$aux" | ForEach-Object {if ($_ -match '6\.7') {if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {$aux.FullName}}}}

Основное объяснение:

  • Получить список txtфайлов Get-ChildItemи |передать результат следующему командлету
  • (трубчатый)для каждого конкретного файлаForEach-Object
  • сохраните его во вспомогательной переменной $aux=$_(обратите внимание на ;точку с запятой в конце однострочника)
  • и получить его содержимое построчно Get-Contentи |передать результат следующему командлету
  • (трубчатый)для каждой конкретной строкиForEach-Object
  • проверить, содержит ли строка 6.7строкуif ($_ -match '6\.7')
  • и если да, то проверьте, соответствует ли дата (первые 19 символов) заданным критериямif ( [datetime] …
  • и если так, то сделайте имя файла общедоступным $aux.FullName
  • и закройте все открывающиеся {s, используя серию закрывающих }s.

решение2

Развивая первоначальный ответ JosefZ, я нахожу следующий ответ более полным.

Включите в файл PowerShell следующее:

$filespath = "\\sampledirectory\log\"
$outputfilename = "\\sampledirectory\log\results.txt"

########## file creation step
Get-ChildItem -Path $filespath *.txt -Recurse |
    ForEach-Object { 
        $aux=$_
        Get-Content "$aux" | 
            ForEach-Object {
                if ($_ -match '6\.7')
                {
                    if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7))
                    {
                        $aux.FullName | Out-File $outputfilename -append
                    }
                }
            }
    }

Связанный контент