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-Key: 6626449744

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

Printed on: May 18, 2024 at 12:05 o'clock

Member: michi1983
michi1983 Apr 03, 2023 at 13:12:24 (UTC)
Goto Top
Hallo,

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

Gruß
Mitglied: 3063370895
3063370895 Apr 03, 2023 updated at 13:23:20 (UTC)
Goto Top
Hi,

kleiner Tipp:
$limit = (Get-Date).AddDays(-1095) #1095 Tage = 3 Jahre
es geht auch
$limit = (Get-Date).AddYears(-3)
Member: DarkZoneSD
DarkZoneSD Apr 03, 2023 updated at 13:29:58 (UTC)
Goto Top
Ist ein seperates Problem aber irwie will der PSScriptAnalyzer bei mir nicht funzen @michi1983
unbenannt
unbenannt2
Mitglied: 3063370895
Solution 3063370895 Apr 03, 2023 updated at 13:29:10 (UTC)
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
Member: michi1983
michi1983 Apr 03, 2023 at 13:23:55 (UTC)
Goto Top
Nutz doch die Windowseigne Powershell ISE Lösung dafür. Da musst du nichts nachinstallieren.
Member: DarkZoneSD
DarkZoneSD Apr 03, 2023 at 13:29:03 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 03, 2023 updated at 13:31:25 (UTC)
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.