-2

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

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

2016-12-07 14:08:43 7,7 b = 123 r = 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, или требуются все усилия для разработки, чтобы выполнить эту задачу.

2 ответа2

0

Расширяя первоначальный ответ 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
                    }
                }
            }
    }
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .