Membuat proses yang dapat dieksekusi yang mengidentifikasi file .txt mana dalam folder yang menyertakan teks tertentu

-2

Sistem operasi saya adalah Windows 10.

Saya memiliki folder yang berisi satu file .txt. Di dalam setiap file terdapat baris yang diformat sebagai berikut:

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

Saya mencari untuk membuat proses yang dapat direproduksi yang dapat saya jalankan yang akan melihat semua file dalam folder dan memberi saya nama file dalam file .txt dari semua file yang berisi 6.7dan tanggal yang lebih besar dari tujuh hari yang lalu.

Skenario contoh:

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

File2 berisi: 2017-01-24 14:08:43 7.7 b=123 r=890

File3 berisi: 2017-01-23 14:08:43 6.7 b=123 r=890

Saya menjalankan proses dan saya menerima file .txt terdiri: File3

Saya tidak tahu apakah ini dapat dilakukan dengan menggunakan baris perintah, PowerShell, atau jika upaya pengembangan penuh diperlukan untuk menyelesaikan tugas ini.

HappyCoding
sumber
Harap dicatat bahwa superuser.com bukan layanan penulisan skrip / kode gratis. Jika Anda memberi tahu kami apa yang telah Anda coba sejauh ini (termasuk skrip / kode yang sudah Anda gunakan) dan di mana Anda macet maka kami dapat mencoba membantu dengan masalah tertentu. Anda juga harus membaca Bagaimana cara saya mengajukan pertanyaan yang bagus? .
DavidPostill

Jawaban:

0

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

atau oneliner setara

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

Penjelasan dasar :

  • Dapatkan daftar txtfile Get-ChildItemdan |hasil pipa ke cmdlet berikutnya
  • (disalurkan) untuk setiap file tertentuForEach-Object
  • simpan ke variabel tambahan $aux=$_(catat ;titik koma di oneliner)
  • dan dapatkan kontennya baris demi baris Get-Contentdan |hasil pipa ke cmdlet berikutnya
  • (disalurkan) untuk setiap jalur tertentuForEach-Object
  • menguji apakah suatu baris berisi 6.7stringif ($_ -match '6\.7')
  • dan jika demikian maka uji apakah tanggal (19 karakter pertama) cocok dengan kriteria yang diberikan if ( [datetime] …
  • dan jika demikian maka buat nama file publik $aux.FullName
  • dan tutup semua pembukaan {menggunakan serangkaian penutupan }.
JosefZ
sumber
Skrip ini menulis nama file ke jendela PowerShell untuk setiap kemunculan teks pencarian yang ditentukan. Itu tidak membuat file baru yang mengandung informasi ini. Saya harus melihat bagaimana cara menulis hasil yang ditampilkan PowerShell ke file untuk mendapatkan tempat yang saya inginkan. Saya menghargai jawaban Anda.
HappyCoding
@ HappyCoding Anda dapat mem-pipe output misalnya ke Out-Filecmdlet . Baca lagi komentar David .
JosefZ
0

Memperluas jawaban asli JosefZ, saya menemukan jawaban berikut lebih lengkap.

Sertakan berikut ini dalam file 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
                    }
                }
            }
    }
HappyCoding
sumber