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.7
e 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
txt
arquivosGet-ChildItem
e|
canalize o resultado para o próximo cmdlet - (canalizado)para cada arquivo específico
ForEach-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-Content
e|
canalize o resultado para o próximo cmdlet - (canalizado)para cada linha específica
ForEach-Object
- testar se uma linha contém
6.7
stringif ($_ -match '6\.7')
- e se sim, teste se a data (primeiros 19 caracteres) corresponde a determinados critérios
if ( [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
}
}
}
}