silvereye
Goto Top

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

Content-ID: 523726

Url: https://administrator.de/contentid/523726

Ausgedruckt am: 24.11.2024 um 18:11 Uhr

TK1987
TK1987 10.12.2019 aktualisiert um 13:00:24 Uhr
Goto Top
# 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  
silvereye
silvereye 11.12.2019 um 17:27:47 Uhr
Goto Top
Hallo TK 1987,

danke für Deine schnelle Antwort. Beim Ausführen des 1. Codeblocks kommt eine Fehlermeldung in der Zeile 12 bei "-d". Ich habe das ersetzt mit "Delimiter ":
Beim 2. Codeblock habe ich das analog zum 1. auch geändert funktioniert dann natürlich auch.

Ich habe den Code so verändert, dass man die Anzahl der Tage vorab als Differenz eingeben kann. Ich habe noch zusätzlich den letzten Zugriffszeitpunkt mit geändert um evtl. Konflikte zu vermeiden:
# 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 xxx Tage, setze Erstelldatum, Änderungsdatum und letzes Zugriffsdatum auf aktuelles Datum
	ls -r $Arbeitspfad | ? {$_.Creationtime -lt (Get-Date).AddDays(-$TagesDiff)} | % {
		$_.CreationTime=get-date
		$_.LastWriteTime=get-date
        $_.LastAccessTime=get-date
		}

# Ausgabe Dateien als CSV
	ls -r $Arbeitspfad | select Fullname,CreationTime,LastWriteTime,LastAccessTime | Export-CSV -Delimiter ';' -nti -encoding Default $CSV  

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?

Danke und Viele Grüße
TK1987
TK1987 11.12.2019 aktualisiert um 19:08:06 Uhr
Goto Top
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.
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.
silvereye
silvereye 12.12.2019 um 16:17:24 Uhr
Goto Top
... vielen Dank. Funktioniert bei mir un d habe es für mich ein bisschen angepasst:
...
# 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='Änderungsdatum vorher';e={$_.LastWriteTime}},  
			@{n='Letztes Zugriffsdatum vorher';e={$_.LastAccessTime}},  
            @{n='Erstelldatum nachher';e={get-date}},  
			@{n='Änderungsdatum nachher';e={get-date}},  
			@{n='Letztes Zugriffsdatum nachher';e={get-date}}| Export-CSV -Delimiter ';' -nti -encoding Default $CSV  


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.
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).
TK1987
Lösung TK1987 13.12.2019 um 09:22:46 Uhr
Goto Top
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).

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  
silvereye
silvereye 13.12.2019 um 13:06:08 Uhr
Goto Top
... klasse, bei mir funktioniert es in der Testumgebung. Werde es gleich mal in einer weiteren Testumgebung mit mehrerern Dateien testen.
Vielen Dank für Deine Unterstützung!