Criação de um processo executável que identifica quais arquivos .txt em uma pasta incluem determinado texto

Criação de um processo executável que identifica quais arquivos .txt em uma pasta incluem determinado texto

Meu sistema operacional é o Windows 10.

Eu tenho uma pasta contendo um ou vários arquivos .txt. Dentro de cada arquivo há linhas formatadas da seguinte forma:

07-12-2016 14:08:43 7,7 b = 123 r = 890

Estou procurando criar um processo reproduzível que eu possa executar, que examine todos os arquivos da pasta e me forneça os nomes dos arquivos em um arquivo .txt de todos os arquivos que contêm 6.7e uma data superior a sete dias atrás.

Cenário de exemplo:

Arquivo1 contém:2016-12-07 14:08:43 7.7 b=123 r=890

Arquivo2 contém:2017-01-24 14:08:43 7.7 b=123 r=890

Arquivo3 contém:2017-01-23 14:08:43 6.7 b=123 r=890

Eu executo o processo e recebo um arquivo .txt contendo:File3

Não sei se isso pode ser feito usando linha de comando, PowerShell ou se são necessários esforços totais de desenvolvimento para realizar esta tarefa.

Responder1

Seguindo o script do 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
                    }
                }
            }
    }

ou oneliner equivalente

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

Explicação básica:

  • Obtenha uma lista de txtarquivos Get-ChildIteme |canalize o resultado para o próximo cmdlet
  • (canalizado)para cada arquivo específicoForEach-Object
  • salve-o em uma variável auxiliar $aux=$_(observe o ;ponto e vírgula final no oneliner)
  • e obtenha seu conteúdo linha por linha Get-Contente |canalize o resultado para o próximo cmdlet
  • (canalizado)para cada linha específicaForEach-Object
  • testar se uma linha contém 6.7stringif ($_ -match '6\.7')
  • e se sim, teste se a data (primeiros 19 caracteres) corresponde a determinados critériosif ( [datetime] …
  • e se sim, torne o nome do arquivo público $aux.FullName
  • e feche todas as aberturas {usando uma série de fechamentos }.

Responder2

Expandindo a resposta original de JosefZ, considero a resposta a seguir mais completa.

Inclua o seguinte em um arquivo 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
                    }
                }
            }
    }

informação relacionada