PowerShell Script opSubtraction Überladung etc
Hallo zusammen,
Hintergrund:
Durch den Datenschutz sind wir gezwungen Dateien die für jedermann zugänglich sind von Zeit zu Zeit zu überprüfen bevor was böses passiert. Wir haben hier Tauschlaufwerke eingerichtet in denen Nutzer Daten untereinander easy austauschen können.
Hier bleiben Dateien oft lange liegen. Es soll jetzt für jeden User aus der AD geschaut werden wie lange die Daten da liegen und danach eine Mail geschickt werden, mit Warnung oder Hinweis dass etwas gelöscht wurde.
Script funktioniert, Nutzer werden ausgelesen und Mail geschickt. Daten zuverlässig gelöscht.
ABER:
Hat ein Benutzer Daten zur Löschung (älter als $loeschen Tage) aber nicht zur Warnung (älter als $warnung Tage aber jünger als $loeschen Tage) in seinem Laufwerk, dann springt er mir in die falsche Schleife.
Lange Rede kurzer Sinn. Hier der Code und die Operatorenverknüpfung um die es sich dreht:
Ich bekomme folgenden Fehler bei der Ausführung:
Danke schon einmal im voraus!
Hintergrund:
Durch den Datenschutz sind wir gezwungen Dateien die für jedermann zugänglich sind von Zeit zu Zeit zu überprüfen bevor was böses passiert. Wir haben hier Tauschlaufwerke eingerichtet in denen Nutzer Daten untereinander easy austauschen können.
Hier bleiben Dateien oft lange liegen. Es soll jetzt für jeden User aus der AD geschaut werden wie lange die Daten da liegen und danach eine Mail geschickt werden, mit Warnung oder Hinweis dass etwas gelöscht wurde.
Script funktioniert, Nutzer werden ausgelesen und Mail geschickt. Daten zuverlässig gelöscht.
ABER:
Hat ein Benutzer Daten zur Löschung (älter als $loeschen Tage) aber nicht zur Warnung (älter als $warnung Tage aber jünger als $loeschen Tage) in seinem Laufwerk, dann springt er mir in die falsche Schleife.
Lange Rede kurzer Sinn. Hier der Code und die Operatorenverknüpfung um die es sich dreht:
If (((Get-ChildItem \\$server\abfall\$user -Recurse | Where-Object {(($heute - $_.LastWriteTime).Days -gt $warnung) -and (($heute - $_.LasWriteTime).Days -lt $loeschen)}) -ne $null) -and (Get-ChildItem \\$server\abfall\$user -Recurse | Where-Object {($heute - $_.LastWriteTime).Days -gt $loeschen}) -ne $null) # herausfinden ob Dateien zur Warnung da sind und welche gelöscht werden.
Ich bekomme folgenden Fehler bei der Ausführung:
PS C:\Users\administrator\Documents> .\abfallpruefungwerk4_test.ps1Für "op_Subtraction" und die folgende Argumenteanzahl kann keine Überladung gefunden werden: "2".
In C:\Users\administrator\Documents\abfallpruefungwerk4_test.ps1:68 Zeichen:75
+ If (((Get-ChildItem \\$server\abfall\$user -Recurse | Where-Object {(($heu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) , MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
Danke schon einmal im voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 279756
Url: https://administrator.de/contentid/279756
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
D.h. also das eine deiner Date-Variablen die du zur Subtraktion nutzt keinen eindeutigen Typ aufweist.
Definiere sie von Anfang an mit expliziter Definition des Typs
Beispiel:
Dann weiß die Powershell auch sicher
um welchen Typ es sich handelt.
Da du hier noch andere Variablen nutzt deren Definition du hier nicht gepostet hast, können wir also nur Vermutungen anstellen.
Aber das ist die Standardmeldung wenn ein Variablentyp nicht passt.
Gruß grexit
FullyQualifiedErrorId : MethodCountCouldNotFindBest
Diese Zeile gibt den entscheidenden Hinweis, die Powershell kann den Typ einer deiner Variablen nicht eindeutig identifizieren, deswegen findet es auch keine passende Funktionsüberladung mit deinen Variablen als Parameter.D.h. also das eine deiner Date-Variablen die du zur Subtraktion nutzt keinen eindeutigen Typ aufweist.
Definiere sie von Anfang an mit expliziter Definition des Typs
Beispiel:
[datetime]$heute = Get-Date
Dann weiß die Powershell auch sicher
um welchen Typ es sich handelt.
Da du hier noch andere Variablen nutzt deren Definition du hier nicht gepostet hast, können wir also nur Vermutungen anstellen.
Aber das ist die Standardmeldung wenn ein Variablentyp nicht passt.
Gruß grexit
Moin Timo,
ich würde das ganze effektiver Lösen, da du ziemlich viel redundante Konstrukte mehrfach verwendest, das kostet Unmengen an CPU und Rechenzeit für das Skript.
Ich würde besser gleich alle Dateien durchlaufen und nur die zutreffenden Dateien ausfiltern und anschließend direkt über den Datei-Owner vie group die Dateien gruppieren.
Anschließend iterierst du über die beiden Gruppen von Dateien (Eine Warn-Gruppe und eine Löschgruppe) und erledigst darauf deine Aktionen (Löschen oder nur benachrichtigen):
Das sieht dann etwa so aus:
Ist meiner Meinung nach wesentlich übersichtlicher und erheblich schneller!
Gruß jodel32
ich würde das ganze effektiver Lösen, da du ziemlich viel redundante Konstrukte mehrfach verwendest, das kostet Unmengen an CPU und Rechenzeit für das Skript.
Ich würde besser gleich alle Dateien durchlaufen und nur die zutreffenden Dateien ausfiltern und anschließend direkt über den Datei-Owner vie group die Dateien gruppieren.
Anschließend iterierst du über die beiden Gruppen von Dateien (Eine Warn-Gruppe und eine Löschgruppe) und erledigst darauf deine Aktionen (Löschen oder nur benachrichtigen):
Das sieht dann etwa so aus:
$warnung = 10
$loeschen = 30
$heute = get-date
# Set für Dateien die vorgewarnt werden sollen
$warn_set = gci "$server\Abfall" -Recurse | ?{$_.LastWriteTime -lt $heute.AddDays(-$warnung) -and $_.LastWriteTime -gt $heute.AddDays(-$loeschen)} | group {$_.GetAccessControl().GetOwner([System.Security.Principal.NTAccount])}
# Set für Dateien die gelöscht werden
$deletion_set = gci "$server\Abfall" -Recurse | ?{$_.LastWriteTime -lt $heute.AddDays(-$loeschen)} | group {$_.GetAccessControl().GetOwner([System.Security.Principal.NTAccount])}
#durchläuft das Set an Usern mit Dateien die vorgewarnt werden sollen
$warn_set | %{
# Email des Users holen
$user_mail = (get-aduser ($_.Name.toString().split('\')[1]) -Properties EMailAddress).EmailAddress
# Dateipfade in ein String laden welcher dann via send-mailmessage übermittelt werden kann
$files = $_.Group.FullName -join "`r`n"
# Send-Mailmessage ...........
}
#durchläuft das Set an Usern mit Dateien die gelöscht werden
$deletion_set | %{
# Email des Users holen
$user_mail = (get-aduser ($_.Name.toString().split('\')[1]) -Properties EMailAddress).EmailAddress
# Dateien des Users die gelöscht werden
$files = $_.Group
$files | Remove-Item -Recurse -Force
# Send-MailMessage ...........
}
Gruß jodel32
Sorry da hab ich gepennt, ist korrigiert ...
Na dann könntest du stattdessen den Usernamen einfach aus dem Pfad zur Datei auslesen
Dazu einfach das Grouping so abändern:
Dazu einfach das Grouping so abändern:
....... | group {$_.Name.Split('\')[4]}