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.7
und 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
txt
DateienGet-ChildItem
und|
leiten Sie das Ergebnis an das nächste Cmdlet weiter - (gepiped)für jede einzelne Datei
ForEach-Object
- Speichern Sie es in einer Hilfsvariable
$aux=$_
(beachten Sie das abschließende;
Semikolon im Einzeiler). - und holen Sie sich den Inhalt zeilenweise
Get-Content
und|
leiten Sie das Ergebnis an das nächste Cmdlet weiter. - (gepiped)für jede einzelne Zeile
ForEach-Object
- Testen, ob eine Zeile
6.7
eine Zeichenfolge enthältif ($_ -match '6\.7')
- und wenn ja, dann testen, ob das Datum (erste 19 Zeichen) den angegebenen Kriterien entspricht
if ( [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
}
}
}
}