Mit PowerShell Dateien aus Verzeichnis incl. Unterverzeichnissen auslesen. Erstelldatum prüfen und ggf. ändern. Auslesen und ändern in log-Datei
Hallo,
da ich im Bereich der Power Shell Programmierung leider nicht über genügend Hintergrundwissen verfüge bitte ich Euch um Hilfe.
Ich möchte mit einer Power Shell in einem Verzeichnis (im Code hinterlegt) mit Unterverzeichnissen nach beliebigen Dateien (ca. 20.000 bis 100.000 Dateien) suchen und den kompletten Pfad, das Erstelldatum und letzte Speicher- und Zugriffsdatum in einer log-Datei speichern (csv).
Während des Suchvorganges soll geprüft werden, ob das Erstelldatum der jeweiligen Datei z.B. älter als 360 Tage zum aktuellen Datum (Tagesdatum) ist. Wenn ja, dann soll das Erstelldatum und das letzte Speicher-und Zugriffsdatum der Datei auf das aktuelle Tagesdatum gesetzt werden.
Meine Hoffnung war, aus einigen Codeschnipseln das zusammen zu kopieren leider ohne Erfolg – da fehlt mir einiges an Basiswissen.
Hat jemand hierfür schon eine ähnliche Lösung realisiert auf die ich aufsatteln könnte?
Vielen Dank vorab für Eure Hilfe
da ich im Bereich der Power Shell Programmierung leider nicht über genügend Hintergrundwissen verfüge bitte ich Euch um Hilfe.
Ich möchte mit einer Power Shell in einem Verzeichnis (im Code hinterlegt) mit Unterverzeichnissen nach beliebigen Dateien (ca. 20.000 bis 100.000 Dateien) suchen und den kompletten Pfad, das Erstelldatum und letzte Speicher- und Zugriffsdatum in einer log-Datei speichern (csv).
Während des Suchvorganges soll geprüft werden, ob das Erstelldatum der jeweiligen Datei z.B. älter als 360 Tage zum aktuellen Datum (Tagesdatum) ist. Wenn ja, dann soll das Erstelldatum und das letzte Speicher-und Zugriffsdatum der Datei auf das aktuelle Tagesdatum gesetzt werden.
Meine Hoffnung war, aus einigen Codeschnipseln das zusammen zu kopieren leider ohne Erfolg – da fehlt mir einiges an Basiswissen.
Hat jemand hierfür schon eine ähnliche Lösung realisiert auf die ich aufsatteln könnte?
Vielen Dank vorab für Eure Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 523726
Url: https://administrator.de/contentid/523726
Ausgedruckt am: 24.11.2024 um 18:11 Uhr
6 Kommentare
Neuester Kommentar
# Arbeitspfade
$Arbeitspfad='C:\Test'
$CSV='C:\Pfad\zur\Datei.CSV'
# Falls Erstelldatum älter als 1 Jahr, setze Erstelldatum und Änderungsdatum auf aktuelles Datum
ls -r $Arbeitspfad | ? {$_.Creationtime -lt (Get-Date).AddYears(-1)} | % {
$_.CreationTime=get-date
$_.LastWriteTime=get-date
}
# Ausgabe Dateien als CSV
ls -r $Arbeitspfad | select Fullname,CreationTime,LastWriteTime | Export-CSV -d ';' -nti -encoding Default $CSV
Die Zeilen 2 & 3 müssen natürlich angepasst werden.
Falls hingegen nur die Dateien als CSV ausgegeben werden sollen, die geändert wurden
# Arbeitspfade
$Arbeitspfad='C:\Test'
$CSV='C:\Pfad\zur\Datei.CSV'
# Falls Erstelldatum älter als 1 Jahr, setze Erstelldatum und Änderungsdatum auf aktuelles Datum
ls -r $Arbeitspfad | ? {$_.Creationtime -lt (Get-Date).AddYears(-1)} | % {
$_.CreationTime=get-date
$_.LastWriteTime=get-date
$_
} | select Fullname,CreationTime,LastWriteTime | Export-CSV -d ';' -nti -encoding Default $CSV
Zitat von @silvereye:
Beim Ausführen des 1. Codeblocks kommt eine Fehlermeldung in der Zeile 12 bei "-d". Ich habe das ersetzt mit "Delimiter
seltsam, bei mir funktioniert delimiter auch mit d abgekürzt... sei's drum.Beim Ausführen des 1. Codeblocks kommt eine Fehlermeldung in der Zeile 12 bei "-d". Ich habe das ersetzt mit "Delimiter
Hat jemand noch eine Idee, wie man zu einer Änderung das Erstelldatum, letzte Speicherung und letzten Zugriff des vorherigen Datenstands in der CSV in der gleichen Zeile dokumentiert?
Macht in dem Moment natürlich nur Sinn, wenn du die 2. Variante nutzen würdest. Also nur Daten als CSV auszugeben, welche wirklich geändert wurden.Man könnte einfach die Ausgabe in der Foreach-Schleife vor die Änderung legen und nachher mit select-object eigene Spalten definieren. Z.B.:
# Arbeitspfade
$Arbeitspfad='C:\Users\egreweo\Desktop\Test_2'
$CSV='C:\Users\egreweo\Desktop\log-Datei.CSV'
# Datumsdifferenz in Tagen
$TagesDiff = 360
# Falls Erstelldatum älter als 1 Jahr, setze Erstelldatum und Änderungsdatum auf aktuelles Datum
ls -r $Arbeitspfad | ? {$_.Creationtime -lt (Get-Date).AddDays(-$TagesDiff)} | % {
$_
$_.CreationTime=get-date
$_.LastWriteTime=get-date
$_.LastAccessTime=get-date
} | select Fullname,
@{n='Erstelldatum vorher';e={$_.CreationTime}},
@{n='Erstelldatum nachher';e={get-date}},
@{n='Änderungsdatum vorher';e={$_.LastWriteTime}},
@{n='Änderungsdatum nachher';e={get-date}},
@{n='Letztes Zugriffsdatum vorher';e={$_.LastAccessTime}},
@{n='Letztes Zugriffsdatum nachher';e={get-date}}| Export-CSV -Delimiter ';' -nti -encoding Default $CSV
Wie du sehen kannst, ist der Output der Foreach-Schleife, der in den select-object Befehl eingeleitet wird Zeile 11 - entspricht damit also noch den Werten vor der Änderung.
Im select-object-Befehl definiere ich dann einfach eigene Spalten mit den gewünschten Werten, die mit Export-CSV ausgegeben werden sollen.
Zitat von @silvereye:
Nicht ganz, ich möchte das ganze Verzeichnis mit dem aktuellen Erstell-, Änderungs- und Letztes Zugriffsdatum in eine CSV-Datei schreiben. Wenn das Erstelldatum zu weit zurück liegt, dann sollen die 3 "Zeitstempel" der Datei geändert werden und in die CSV-Datei geschrieben werden. D.h. es gibt mal 3 Spalten (Datum vorher) zu einer Datei und ggf. noch 3 weitere Spalten mit einem Datum (Datum nachher).
Nicht ganz, ich möchte das ganze Verzeichnis mit dem aktuellen Erstell-, Änderungs- und Letztes Zugriffsdatum in eine CSV-Datei schreiben. Wenn das Erstelldatum zu weit zurück liegt, dann sollen die 3 "Zeitstempel" der Datei geändert werden und in die CSV-Datei geschrieben werden. D.h. es gibt mal 3 Spalten (Datum vorher) zu einer Datei und ggf. noch 3 weitere Spalten mit einem Datum (Datum nachher).
Dann eben noch ganz anders...
# Für Alle Objekte im $Arbeitspfad
ls -r $Arbeitspfad | % {
if ($_.CreationTime -lt (get-date).AddDays(-$TagesDiff)) # Wenn Objekt älter als $TagesDiff
{ # dann...
New-Object PSObject -Property @{
Pfad=$_.Fullname
'Erstelldatum vorher'=$_.CreationTime
'Änderungsdatum vorher'=$_.LastWriteTime
'Letzter Zugriff vorher'=$_.LastAccessTime
'Erstelldatum nachher'=get-date
'Änderungsdatum nachher'=get-date
'Letzter Zugriff nachher'=get-date
}
$_.CreationTime=get-date
$_.LastWriteTime=get-date
$_.LastAccessTime=get-date
} else { # sonst...
New-Object PSObject -Property @{
Pfad=$_.Fullname
'Erstelldatum vorher'=$_.CreationTime
'Änderungsdatum vorher'=$_.LastWriteTime
'Letzter Zugriff vorher'=$_.LastAccessTime
}
}
} | select Pfad,
'Erstelldatum vorher',
'Änderungsdatum vorher',
'Letzter Zugriff vorher',
'Erstelldatum nachher',
'Änderungsdatum nachher',
'Letzter Zugriff nachher' | Export-CSV -Delimiter ';' -nti -encoding Default $CSV