darkzonesd
Goto Top

Ordner löschen falls Datum älter als 3 Jahre

Moin,

ich habe eine Ordnerstruktur in der die Ordner im Namen das Erstellungsdatum haben.
ordner
Ich habe das folgende Skript bis jetzt:

$limit = (Get-Date).AddDays(-1095) #1095 Tage = 3 Jahre

Get-ChildItem -Path "C:\Users\XXX\Desktop\TestDelete" -Recurse -Directory | Foreach-Object{  
	
	if ([string]$_.Name -as [DateTime])
	{
		Write-Host "Contains Date"  
		if ($_.Name -lt $limit)
		{
			Remove-Item -Path $_.FullName -Force -Recurse
		}else{Write-Host "Ist nicht alt genug zum loeschen"}  
	}
	else { Write-Host "Doesnt contain Date" }  
}
Das soll eben die Ordner löschen bei denen das Datum im Dateinamen älter als 3 Jahre ist in dem er den String in ein DateTime umwandelt. (Ich weiß man kann es auch mit der CreationTime machen aber zum testen ist das besser mit Name).

Das Problem ist jetzt allerdings das er recht wahllos die Ordner löscht, er löscht einen Ordner der 2016 als Jahr hat, aber nicht den mit 2010 im Namen. Ich nehme mal schwer an das ich einen Fehler gemacht habe und nicht das System spinnt, kann mir da jemand auf die Sprünge helfen?


Grüße face-smile

Content-ID: 6626449744

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

Ausgedruckt am: 24.11.2024 um 00:11 Uhr

michi1983
michi1983 03.04.2023 um 15:12:24 Uhr
Goto Top
Hallo,

debugge doch das Script und schau dir die Werte an, dann siehst du ja gleich woran es hakt.

Gruß
3063370895
3063370895 03.04.2023 aktualisiert um 15:23:20 Uhr
Goto Top
Hi,

kleiner Tipp:
$limit = (Get-Date).AddDays(-1095) #1095 Tage = 3 Jahre
es geht auch
$limit = (Get-Date).AddYears(-3)
DarkZoneSD
DarkZoneSD 03.04.2023 aktualisiert um 15:29:58 Uhr
Goto Top
Ist ein seperates Problem aber irwie will der PSScriptAnalyzer bei mir nicht funzen @michi1983
unbenannt
unbenannt2
3063370895
Lösung 3063370895 03.04.2023 aktualisiert um 15:29:10 Uhr
Goto Top
Der Fehler ist, dass du einen String mit einem Datum vergleichst.
if ($_.Name -lt $limit)

Versuchs mal mit
$limit = (Get-Date).AddYears(-3)

Get-ChildItem -Path "C:\Users\XXX\Desktop\TestDelete" -Recurse -Directory | Foreach-Object{  
	
	if ([string]$_.Name -as [DateTime])
	{
		Write-Host "Contains Date"  
		if ([string]$_.Name -as [DateTime] -lt $limit)
		{
			Remove-Item -Path $_.FullName -Force -Recurse
		}else{Write-Host "Ist nicht alt genug zum loeschen"}  
	}
	else { Write-Host "Doesnt contain Date" }  
}

Zitat von @DarkZoneSD:

Ist ein seperates Problem..
dann bitte auch einen separaten Post
michi1983
michi1983 03.04.2023 um 15:23:55 Uhr
Goto Top
Nutz doch die Windowseigne Powershell ISE Lösung dafür. Da musst du nichts nachinstallieren.
DarkZoneSD
DarkZoneSD 03.04.2023 um 15:29:03 Uhr
Goto Top
Merci, habe voll verpennt das er den String garnicht parsed.

$limit = (Get-Date).AddYears(-3)

		if ([DateTime]::ParseExact($_.Name,"dd.MM.yyyy", [Globalization.CultureInfo]::CreateSpecificCulture('de-DE')) -lt $limit)  

Die dd.MM.yyyy schreibweise ist in der de-DE hinterlegt oder wie genau hängt das zusammen?

beste Grüße face-smile
3063370895
3063370895 03.04.2023 aktualisiert um 15:31:25 Uhr
Goto Top
Zitat von @DarkZoneSD:

Merci, habe voll verpennt das er den String garnicht parsed.

$limit = (Get-Date).AddYears(-3)

		if ([DateTime]::ParseExact($_.Name,"dd.MM.yyyy", [Globalization.CultureInfo]::CreateSpecificCulture('de-DE')) -lt $limit)  

Die dd.MM.yyyy schreibweise ist in der de-DE hinterlegt oder wie genau hängt das zusammen?

beste Grüße face-smile

habs nochmal abgekürzt, du kannst den String auch so parsen wie du es oben schon gemacht hast.
Der FormatProvider, den ich angegeben hatte, wäre nicht nötig gewesen. Es geht auch mit:
[datetime]::ParseExact("01.12.2021","dd.MM.yyyy",$null)  
Das Format dd.MM.yyyy wird durch das zweite Argument vorgegeben.