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.7
y 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
txt
archivosGet-ChildItem
y|
canalice el resultado al siguiente cmdlet - (canalizado)para cada archivo en particular
ForEach-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-Content
y|
canalizar el resultado al siguiente cmdlet - (canalizado)para cada línea en particular
ForEach-Object
- probar si una línea contiene
6.7
una cadenaif ($_ -match '6\.7')
- y si es así, pruebe si la fecha (primeros 19 caracteres) coincide con los criterios dados
if ( [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
}
}
}
}