Osel 0 Geschrieben 8. Dezember 2022 Melden Teilen Geschrieben 8. Dezember 2022 Moin zusammen, bisher konnte ich all meine kleinen Problemchen anhand Euer Hinweise und Tipps erfolgreich lösen - mehr oder weniger elegant . Vielen Dank also auch von mir! Allerdings fehlt mir an der einen oder anderen Stelle immer noch ein gewisses Grundverständnis. Momentan habe ich wieder etwas mehr Zeit zum Üben & Testen, aber diesmal komme ich nicht wirklich voran. Hier zum Beispiel: get-childitem -Path "U:\Eigene Dateien" -Recurse -filter *.pdf | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-365)} | Get-acl | Where-Object {$_.owner -like '*q0219005*'} Die Aufgabe (gelöst): Lösche alle PDF von einem bestimmten (in meinem Fall technischen) User, die älter (oder neuer) als x Tage sind. Das Remove-Item habe ich vorsichtshalber hier weggelassen. Zur vorherigen Kontrolle führe ich die Zeilen einzeln aus und gucke, ob das Ergebnis "einigermaßen" hinkommt - ich weiß: weniger elegant ... Ich versuche nun, Informationen beider Objekte (get-childitem-Objekt & get-acl-Objekt) auszugeben. Meine kreativen Versuche werden allesamt mit den unterschiedlichsten Fehlerhinweisen quittiert :-( Zum Beispiel möchte ich zur Kontrolle anstelle des Remove-Item mir vorher die Liste der zu löschenden Dateien ausgeben lassen. Also sinngemäß: get-childitem -Path "U:\Eigene Dateien\Privat" -Recurse -filter *.pdf | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-300)} | Get-acl | Where-Object {$_.owner -like '*q0219005*'} | Write-host $_.LastWriteTime, $_.Owner, $_.FullName Lohnt sich das Weiterforschen? Oder bin ich auf dem Holzweg, weil das gar nicht funktionieren kann und ich sollte mich so langsam mal mit einem "echten" (mehrzeiligem) Script beschäftigen? Vielen Dank für jeglichen Hinweis. Markus Zitieren Link zu diesem Kommentar
Beste Lösung BOfH_666 577 Geschrieben 8. Dezember 2022 Beste Lösung Melden Teilen Geschrieben 8. Dezember 2022 (bearbeitet) Markus, willkommen im MCSEboard. vor 32 Minuten schrieb Osel: Zum Beispiel möchte ich zur Kontrolle anstelle des Remove-Item mir vorher die Liste der zu löschenden Dateien ausgeben lassen. Eine einfache Möglichkeit ist es, das Ergebnis der Abfrage in einer Variablen zu speichern und diese einmal auszugeben. Wenn alles wie gewünscht aussieht, könntest Du mit der Variablen weiterarbeiten und deren Inhalt einfach an "Remove-Item" weiterreichen. Statt "Write-Host" solltest Du dann aber bitte "Select-Object" benutzen. $Result = Get-ChildItem -Path 'U:\Eigene Dateien\Privat' -Recurse -filter *.pdf | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-300)} -PipelineVariable CurFile | Get-acl | Where-Object {$_.owner -like '*q0219005*'} | Select-Object -Property Owner, @{Name = 'LastWriteTime'; Expression= {$CurFile.LastWriteTime}}, @{Name = 'FullName'; Expression= {$CurFile.FullName}} $Result $Result | Remove-Item -WhatIf So ungefähr könnte es aussehen ... !! ungetestet - bitte vorher mit Test-Daten prüfen !! bearbeitet 8. Dezember 2022 von BOfH_666 1 Zitieren Link zu diesem Kommentar
Osel 0 Geschrieben 8. Dezember 2022 Autor Melden Teilen Geschrieben 8. Dezember 2022 Hallo BOfH_666, Zitat willkommen im MCSEboard. vielen Dank! Zitat Eine einfache Möglichkeit ist es, das hatte ich befürchtet: Ich sehe den Wald vor lauter Bäumen nicht. Mit Variablen hatte ich auch experiment. Die Ergebnisse werden auch in zwei Variablen gespeichert und angezeigt. Hier hatte ich bisher auch das Problem, dass ich diese Variablen "am Ende" (auch mit Select-Objekt) nicht ansprechen konnte. Ich habe gelernt, dass Variablen ja global oder nur innerhalb eines Blocks gültig sind. Vermutlich muss ich in dieser Richtung weitersuchen ... Vielen Dank für den Hinweis! Zitat solltest Du dann aber bitte "Select-Object" benutzen. mach ich. Versprochen. Vielen Dank! Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 8. Dezember 2022 Melden Teilen Geschrieben 8. Dezember 2022 (bearbeitet) vor 8 Minuten schrieb Osel: Die Ergebnisse werden auch in zwei Variablen gespeichert und angezeigt. Wieso 2? Warum zeigst Du den Code nicht so, wie Du ihn auch verwendest? vor 8 Minuten schrieb Osel: Hier hatte ich bisher auch das Problem, dass ich diese Variablen "am Ende" (auch mit Select-Objekt) nicht ansprechen konnte. ?? Je konkreter Deine Frage ist (und der Code, den Du zeigst), desto konkreter fallen auch die Antworten aus. vor 8 Minuten schrieb Osel: Ich habe gelernt, dass Variablen ja global oder nur innerhalb eines Blocks gültig sind. Wie so häufig - es kommt darauf an. Ja - variablen haben einen "Scope" in dem sie "gültig" sind. Das sollte aber beim "Rumprobieren" in der Konsole oder ISE order VSCode erstmal keine Rolle spielen. Funktioniert der Code, den ich oben noch angefügt habe? bearbeitet 8. Dezember 2022 von BOfH_666 Zitieren Link zu diesem Kommentar
Osel 0 Geschrieben 8. Dezember 2022 Autor Melden Teilen Geschrieben 8. Dezember 2022 (bearbeitet) Hallo BOfH_666, Zitat Warum zeigst Du den Code nicht so, wie Du ihn auch verwendest? tut mir leid für mein missverständliches Ausdrücken. Der Code aus dem ersten Post funktioniert. Die vielen nicht funktionierenden Versionen wollte jetzt nicht alle posten. Bis auf Zeile 5 (natürlich ohne die Nummerierung) funktioniert das Script. Ich möchte jetzt eine Ausgabe erzeugen mit den Eigenschaften FullName, LastWriteTime (aus dem Get-ChildItem (Objekt?)) und Owner (aus dem Get-ACL (Objekt?)) Als Beispiel dieser (letzter) gescheiterte Versuch (1) get-childitem -Path "U:\Eigene Dateien\Privat" -Recurse -filter *.pdf -PipelineVariable 'mDatei'| (2) Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-300)} | (3) Get-acl | (4) Where-Object {$_.owner -like '*q0219005*'} | (5) Select-Object $mDatei.FullName, $mDatei.LastWriteTime, owner Fehler: Select-Object : Der Wert eines Parameters war NULL. Einer der folgenden Typen wurde erwartet: {System.String, System.Management.Automation.ScriptBlock}. In Zeile:5 Zeichen:17 + ... Select-Object $mDatei.FullName, $mDatei.LastWriteTime, ow ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Select-Object], NotSupportedException + FullyQualifiedErrorId : DictionaryKeyUnknownType,Microsoft.PowerShell.Commands.SelectObjectCommand Vielleicht beschreibe ich mein Problem so: Ich habe noch Verständnisprobleme mit dem Ansprechen einer Variable. $_. ist z. B. eine Besonderheit von dem where-object. Ich glaube auch zu wissen, dass immer nur ein Objekt über die Pipe "wandert". Ich hoffte, das würde vielleicht an der Schreibweise liegen ("Objektorientiert"?). Ich fürchte aber, dass wenn "ich" in Zeile (5) angekommen bin, ich auf das Objekt in Zeile (1) nicht mehr zugreifen kann. Deshalb habe ich auch angefangen mich für Variablen zu interessieren - bislang aber 0 Erfolg. Was ich bisher an Tipps & Ticks gefunden habe, hört da auf, wo es spannend wird (für mich). Vielleicht kannst Du mich in die richtige Richtung schubsen? Ich kann die Ausgabe von Get-Childitem in einer Variable speichern und ich kann die Ausgabe von Get-ACL in einer Variable speichern. Beides auch anzeigen lassen. Die nächste Variante wäre nun mich zu entscheiden, welche Liste ich in einer Variable speichern möchte und die dann mit einer Schleife abzuarbeiten. Ich wollte es aber (aus meiner Sicht) nicht "so komplex" werden lassen. Mir würde es schon reichen wenn Du zu meinem fehlerhaften Script sagst: Schreib es so und so oder auch Vergiss es, es geht nur mit einer Schleife. Meine Dateien bekomme ich ja gelöscht. Ich möchte doch vorher nur eine "schöne" Anzeige erstellen der Dateien, die gelöscht werden ... Vielen Dank für Deine Zeit & Geduld Markus Ich Dösel! Vielen Dank für Deine Lösung. Die funktioniert natürlich, wenn der Fragende auch richtig liest und kopiert. Du bist ein Guter! Markus bearbeitet 8. Dezember 2022 von Osel Uzb (User zu b***d) Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 8. Dezember 2022 Melden Teilen Geschrieben 8. Dezember 2022 (bearbeitet) vor 54 Minuten schrieb Osel: Vielleicht beschreibe ich mein Problem so: Ich habe noch Verständnisprobleme mit dem Ansprechen einer Variable. $_. ist z. B. eine Besonderheit von dem where-object. Ich glaube auch zu wissen, dass immer nur ein Objekt über die Pipe "wandert". $_ representiert immer das jeweilige Pipeline-Objekt an der aktuellen Stelle der Pipeline. Möchtest Du an einer späteren Stelle der Pipeline auf Elemente von einer früheren Stelle zugreifen, musst Du an der Stelle den "common Parameter" "-PipelineVariable" einsetzen, von dem Du später die Werte anzeigen möchtest. Also so, wie ich das in meinem Code-Beispiel gemacht habe. Hier noch ein bissl Material zum Nachlesen: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_commonparameters?view=powershell-7.2 https://fercorrales.com/powershell-practical-use-of-pipelinevariable-common-parameter/ https://mcpmag.com/articles/2016/12/15/pipelinevariable-common-parameter.aspx Eine weitere häufig genutzte Möglichkeit wäre, eine Schleife einzusetzen und darin ein "[PSCustomObject]" zu benutzen: $Result = Get-ChildItem -Path 'U:\Eigene Dateien\Privat' -Recurse -filter *.pdf | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-300) } | ForEach-Object { $ACL = Get-Acl -Path $_.FullName [PSCustomObject]@{ Owner = $ACL.Owner Name = $_.Name FullName = $_.FullName LastWriteTime = $_.LastWriteTime } } $Result bearbeitet 8. Dezember 2022 von BOfH_666 1 Zitieren Link zu diesem Kommentar
Osel 0 Geschrieben 8. Dezember 2022 Autor Melden Teilen Geschrieben 8. Dezember 2022 Hallo BOfH_666, vielen Dank für Deine Mühe und Deine Erklärungen! Und vielen Dank für das zweite Beispiel!!! Markus Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.