Crear un proceso ejecutable que identifique qué archivos .txt en una carpeta incluyen cierto texto

Crear un proceso ejecutable que identifique qué archivos .txt en una carpeta incluyen cierto texto

Mi sistema operativo es Windows 10.

Tengo una carpeta que contiene de uno a muchos archivos .txt. Dentro de cada archivo hay líneas con el siguiente formato:

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

Estoy buscando crear un proceso reproducible que pueda ejecutar y que revise todos los archivos de la carpeta y me proporcione los nombres de los archivos en un archivo .txt de todos los archivos que contienen 6.7y una fecha mayor a siete días.

Escenario de ejemplo:

El archivo 1 contiene:2016-12-07 14:08:43 7.7 b=123 r=890

El archivo 2 contiene:2017-01-24 14:08:43 7.7 b=123 r=890

El archivo 3 contiene:2017-01-23 14:08:43 6.7 b=123 r=890

Ejecuto el proceso y recibo un archivo .txt que contiene:File3

No sé si esto se puede hacer usando la línea de comandos, PowerShell o si se necesitan esfuerzos completos de desarrollo para realizar esta tarea.

Respuesta1

Siguiendo el script de 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
                    }
                }
            }
    }

o una línea 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}}}}

Explicación básica:

  • Obtenga una lista de txtarchivos Get-ChildItemy |canalice el resultado al siguiente cmdlet
  • (canalizado)para cada archivo en particularForEach-Object
  • guárdelo en una variable auxiliar $aux=$_(tenga en cuenta ;el punto y coma final en la línea)
  • y obtener su contenido línea por línea Get-Contenty |canalizar el resultado al siguiente cmdlet
  • (canalizado)para cada línea en particularForEach-Object
  • probar si una línea contiene 6.7una cadenaif ($_ -match '6\.7')
  • y si es así, pruebe si la fecha (primeros 19 caracteres) coincide con los criterios dadosif ( [datetime] …
  • y si es así, haga público el nombre del archivo. $aux.FullName
  • y cierre todas las aberturas {utilizando una serie de cierres }.

Respuesta2

Ampliando la respuesta original de JosefZ, encuentro la siguiente respuesta más completa.

Incluya lo siguiente dentro de un archivo de 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
                    }
                }
            }
    }

información relacionada