none
Variable durch die Pipe "mitnehmen" - Verständnisfrage

    Frage

  • Hallo zusammen,

    ich habe eine Verständnisfrage und hoffe, Ihr könnt mir hier weiterhelfen.

    Ich zeig es an meinem konkreten Beispiel, welches sich in der Exchange Online Remote PowerShell abspielt.

    Was möchte ich?
    Eine CSV Datei für jede Mailbox, in der der protokollierte E-Mail Verkehr der letzten 7 Tage steht.
    Die Datei soll heißen, wie die Mailbox.

    Der Befehl könnte wie folgt aussehen:

    Get-Mailbox | ForEach-Object {Get-MessageTrace -SenderAddress $_.UserPrincipalName -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date)} | Export-Csv -Path ("D:\TMP\" + [Variable $_.Name VOR der Pipe])

    Wie komme ich am Ende bei Export-CSV an den Namen des Mailbox Objektes?

    Danke schon mal für die Hilfe! :)

    Matchbox

    Dienstag, 6. Februar 2018 10:09

Antworten

  •  

    Nein ich stand drauf. :) Ich hatte ehrlich gesagt gar nicht auf den Inhalt deines Codes geachtet, sondern nur auf das Prinzip.
    Richtigerweise müsste man das also eher so machen:

    $AllMailboxes = Get-Mailbox
    Foreach ($Mailbox in $AllMailboxes) {
    		Get-MessageTrace -SenderAddress $Mailbox.UserPrincipalName -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date)} | Export-Csv -Path "D:\TMP\$($Mailbox.Name).csv"
    }
     
    Ich hab kein Exchange, daher ist auch das hier nicht getestet.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 6. Februar 2018 13:09
    Moderator

Alle Antworten

  • In dem man sich diesen vorher in einer globalen Variable ablegt. Dann ist er von überall verwendbar.
    Dienstag, 6. Februar 2018 10:11
  • ... oder man nimmt den Common Parameter -PipelineVariable

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. Februar 2018 10:23
  • Einfach die Mailbox einer Variable zuweisen und diese dann pipen. Dann hast du bei Bedarf jederzeit Zugriff auf alle Eigenschaften.

    $Mailbox = Get-Mailbox
    $Mailbox | ForEach-Object {Get-MessageTrace -SenderAddress $_.UserPrincipalName -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date)} | Export-Csv -Path ("D:\TMP\$($Mailbox.Name).csv"])

      


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 6. Februar 2018 11:11
    Moderator
  • Man muss auch nicht unbedingt alles in einer Pipeline machen, manchmal ist der klassische Weg über eine ForEach-Schleife übersichtlicher.

    Nebenbei: foreach kann auch drei Skriptblöcke haben.

    ... | foreach{Wird davor ausgeführt}{Ist die Schleife}{Wird danach ausgeführt; kann man auch leer lassen}

    Dienstag, 6. Februar 2018 11:18
  • hmmm ... da möchte ich aber noch darauf hinweisen, dass Dein foreach nur der Alias für Foreach-Object ist und quasi nur mit der Pipeline sinnbringend genutzt werden kann.  ;-)

    ... und ganz nebenbei hat Foreach-Object 4  mögliche Scriptblöcke ....


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Dienstag, 6. Februar 2018 11:24
    Dienstag, 6. Februar 2018 11:23
  • Vielen Dank!

    Sorry - aber ich stehe glaub ich gerade auf dem Schlauch.
    Get-Mailbox gibt mir doch eine Liste von allen Mailbox Objekten zurück, die ich nach der ersten Pipe mit ForEach-Object durchlaufe.
    Innerhalb der "Schleife" greife ich mit $_.xxx auf die Properties des jeweiligen Mailbox Objektes zu.
    (Meinem Verständnis nach, müsste ich hier eine Variable mir dem aktuellen Mailbox Objekt füllen. á la $ActualMailbox = $_)
    Wenn ich mich am Ende wieder auf die Variable $Mailbox beziehe, ist das doch wie zu Beginn definiert eine Liste mit allen Mailbox Objekten, oder?

    Dienstag, 6. Februar 2018 12:57
  •  

    Nein ich stand drauf. :) Ich hatte ehrlich gesagt gar nicht auf den Inhalt deines Codes geachtet, sondern nur auf das Prinzip.
    Richtigerweise müsste man das also eher so machen:

    $AllMailboxes = Get-Mailbox
    Foreach ($Mailbox in $AllMailboxes) {
    		Get-MessageTrace -SenderAddress $Mailbox.UserPrincipalName -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date)} | Export-Csv -Path "D:\TMP\$($Mailbox.Name).csv"
    }
     
    Ich hab kein Exchange, daher ist auch das hier nicht getestet.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 6. Februar 2018 13:09
    Moderator
  • Super - so hab ich es dann letztlich auch gemacht.

    Danke! :)

    Dienstag, 6. Februar 2018 13:44
  • Man muss auch nicht unbedingt alles in einer Pipeline machen, manchmal ist der klassische Weg über eine ForEach-Schleife übersichtlicher


    Absolut. Für Scripte gilt das sogar immer.

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 6. Februar 2018 13:53
    Moderator
  • Absolut. Für Scripte gilt das sogar immer.

    hmmmmmm ....  ;-)

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. Februar 2018 14:32