Jump to content

Pipe: Anzeige von Informationen zweier Objekte möglich?


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar
  • Beste Lösung

Markus,

 

willkommen im MCSEboard.  :hallo:

 

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 von BOfH_666
Link zu diesem Kommentar

Hallo BOfH_666,

 

Zitat

willkommen im MCSEboard.  :hallo:

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!

Link zu diesem Kommentar
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 von BOfH_666
Link zu diesem Kommentar

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 von Osel
Uzb (User zu b***d)
Link zu diesem Kommentar
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 von BOfH_666
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...