Erstellen eines ausführbaren Prozesses, der erkennt, welche TXT-Dateien in einem Ordner bestimmten Text enthalten

Erstellen eines ausführbaren Prozesses, der erkennt, welche TXT-Dateien in einem Ordner bestimmten Text enthalten

Mein Betriebssystem ist Windows 10.

Ich habe einen Ordner mit einer oder mehreren TXT-Dateien. Jede Datei enthält Zeilen im folgenden Format:

07.12.2016 14:08:43 7.7 b=123 r=890

Ich möchte einen reproduzierbaren Prozess erstellen, den ich ausführen kann, der alle Dateien im Ordner durchsucht und mir die Dateinamen aller Dateien in einer TXT-Datei bereitstellt, die Folgendes enthalten 6.7und deren Datum länger als sieben Tage zurückliegt.

Beispielszenario:

Datei1 enthält:2016-12-07 14:08:43 7.7 b=123 r=890

Datei2 enthält:2017-01-24 14:08:43 7.7 b=123 r=890

Datei3 enthält:2017-01-23 14:08:43 6.7 b=123 r=890

Ich führe den Vorgang aus und erhalte eine TXT-Datei mit folgendem Inhalt:File3

Ich weiß nicht, ob dies mit der Befehlszeile oder PowerShell möglich ist oder ob zum Erfüllen dieser Aufgabe umfassender Entwicklungsaufwand erforderlich ist.

Antwort1

Folgendes PowerShell-Skript

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

oder gleichwertiger Oneliner

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

Grundlegende Erklärung:

  • Holen Sie sich eine Liste der txtDateien Get-ChildItemund |leiten Sie das Ergebnis an das nächste Cmdlet weiter
  • (gepiped)für jede einzelne DateiForEach-Object
  • Speichern Sie es in einer Hilfsvariable $aux=$_(beachten Sie das abschließende ;Semikolon im Einzeiler).
  • und holen Sie sich den Inhalt zeilenweise Get-Contentund |leiten Sie das Ergebnis an das nächste Cmdlet weiter.
  • (gepiped)für jede einzelne ZeileForEach-Object
  • Testen, ob eine Zeile 6.7eine Zeichenfolge enthältif ($_ -match '6\.7')
  • und wenn ja, dann testen, ob das Datum (erste 19 Zeichen) den angegebenen Kriterien entsprichtif ( [datetime] …
  • und wenn ja, dann machen Sie den Dateinamen öffentlich $aux.FullName
  • und schließen Sie alle öffnenden {s mit einer Reihe schließender }s.

Antwort2

Ausgehend von der ursprünglichen Antwort von JosefZ finde ich die folgende Antwort vollständiger.

Fügen Sie Folgendes in eine PowerShell-Datei ein:

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

verwandte Informationen