none
Select Parameter aus mehreren Pieps RRS feed

  • Frage

  • Hallo zusammen,

    ich weiss nicht so genau ob der Titel so richtig ist. Ich stehl mal den Code ein, dann wird es wahrscheinlich klarer:

    $Database = get-mailboxdatabase | where {$_.IssueWarningQuota -lt 2GB -and $_.MasterServerOrAvailabilityGroup -eq "DAG" } foreach ($Item in $Database) { write-host $Item get-mailbox -Database $Item -RecipientTypeDetails "UserMailbox"| where {$_.UseDatabaseQuotaDefaults -eq $false -and $_.samaccountname -notlike "si*" -and $_.samaccountname -notlike "mo*" -and $_.samaccountname -notlike "mb*" -and $_.samaccountname -notlike "fc*" -and $_.samaccountname -notlike "srvc*" -and $_.samaccountname -notlike "sv*" }

    | Get-MailboxStatistics |select samaccountname,Database,TotalItemSize |Export-CSV "C:\temp\std_user_nonDatabaseQuotaDefaults_$Item.csv" }

    Wie man sehen kann, lasse ich mir erst alle DB´s aus einer Bestimmten DAG auslesen, dann mache ich ein Get-Mailbox mit einigen filtern. Danach ein Get-MailboxStatistics und ein Select. In dem Select habe ich drei Parameter angegeben, es geht auch soweit alles, leider kennt Mailboxstatistics kein samaccountname, ich will aber auch nicht mit dem Displaynamen arbeiten. Wie kann ich es nun erreichen, dass mir im select auch der samaccountname angezeigt wird?

    Danke für Tipps und Anregungen :-)

    Gruß

    Uwe

    Dienstag, 2. Oktober 2012 14:09

Antworten

  • Was sind denn "Pieps"? :)

    Jedenfalls, eine Möglichkeit ist, den Output mit select-object entsprechend umzubauen, d.h dir eigene Properties mit den gewünschten Werten zu erstellen.

    Ein einfaches Beispiel zum Verständnis: Angenommen, ich möchte mit Get-process alle Prozesse mit ID und Prozessname ausgeben und in die Ausgabe eine zusätzliche Spalte einfügen, in der alle Prozessnamen in Großbuchstaben geschrieben sind. Die Spalte soll "ProcNameInGross" heissen:
     

    Get-Process | select id,Processname, @{name = "ProcNameInGross" ; expression = { $_.Processname.toupper()}}
      


    Auf deinen Code übertragen, heißt das du setzt an der Stelle an, an dem der Samaccountname noch vorhanden ist. Das ist in er Pipeline direkt nach deiner "where {$_.UseDatabaseQuotaDefaults ..." - Bedingung.

    Dann selektierst du Samaccountname und erstellst dir zwei weitere Properties (Database und Totalitemsize) mit den Werten aus "Get-MailboxStatistics":

    select samaccountname,@{Name = "Database" ; Expression = { (Get-MailboxStatistics $_).Database} ,  @{Name = "TotalItemSize" ; Expression = { (Get-MailboxStatistics $_).TotalItemSize }  


    Da ich mangels Exchange den Code nicht testen kann, wäre es gut wenn du das Prinzip verstanden hast. :)
    Dann kannst du das ganze an Export-CSV übergeben. Die ganze Pipeline:

    get-mailbox -Database $Item -RecipientTypeDetails "UserMailbox"| where { <deine Bedingungen> } |
    select samaccountname,@{Name = "Database" ; Expression = { (Get-MailboxStatistics $_).Database} ,  @{Name = "TotalItemSize" ; Expression = { (Get-MailboxStatistics $_).TotalItemSize }  |
    Export-CSV "C:\temp\std_user_nonDatabaseQuotaDefaults_$Item.csv" 
     

    Der einzige "Nachteil" an dieser Methode ist, das nun Get-MailboxStatistics je Mailbox zweimal aufgerufen wird. Falls das ein Performanceproblem bei dir geben sollte, kann man das Ganze auch so umbauen, das das nur einmal passiert. Ich wollte es aber nicht noch komplizierter machen, daher schau mal ob dir das so reicht.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Dienstag, 2. Oktober 2012 16:10
    Moderator

Alle Antworten

  • Was sind denn "Pieps"? :)

    Jedenfalls, eine Möglichkeit ist, den Output mit select-object entsprechend umzubauen, d.h dir eigene Properties mit den gewünschten Werten zu erstellen.

    Ein einfaches Beispiel zum Verständnis: Angenommen, ich möchte mit Get-process alle Prozesse mit ID und Prozessname ausgeben und in die Ausgabe eine zusätzliche Spalte einfügen, in der alle Prozessnamen in Großbuchstaben geschrieben sind. Die Spalte soll "ProcNameInGross" heissen:
     

    Get-Process | select id,Processname, @{name = "ProcNameInGross" ; expression = { $_.Processname.toupper()}}
      


    Auf deinen Code übertragen, heißt das du setzt an der Stelle an, an dem der Samaccountname noch vorhanden ist. Das ist in er Pipeline direkt nach deiner "where {$_.UseDatabaseQuotaDefaults ..." - Bedingung.

    Dann selektierst du Samaccountname und erstellst dir zwei weitere Properties (Database und Totalitemsize) mit den Werten aus "Get-MailboxStatistics":

    select samaccountname,@{Name = "Database" ; Expression = { (Get-MailboxStatistics $_).Database} ,  @{Name = "TotalItemSize" ; Expression = { (Get-MailboxStatistics $_).TotalItemSize }  


    Da ich mangels Exchange den Code nicht testen kann, wäre es gut wenn du das Prinzip verstanden hast. :)
    Dann kannst du das ganze an Export-CSV übergeben. Die ganze Pipeline:

    get-mailbox -Database $Item -RecipientTypeDetails "UserMailbox"| where { <deine Bedingungen> } |
    select samaccountname,@{Name = "Database" ; Expression = { (Get-MailboxStatistics $_).Database} ,  @{Name = "TotalItemSize" ; Expression = { (Get-MailboxStatistics $_).TotalItemSize }  |
    Export-CSV "C:\temp\std_user_nonDatabaseQuotaDefaults_$Item.csv" 
     

    Der einzige "Nachteil" an dieser Methode ist, das nun Get-MailboxStatistics je Mailbox zweimal aufgerufen wird. Falls das ein Performanceproblem bei dir geben sollte, kann man das Ganze auch so umbauen, das das nur einmal passiert. Ich wollte es aber nicht noch komplizierter machen, daher schau mal ob dir das so reicht.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Dienstag, 2. Oktober 2012 16:10
    Moderator
  • Hallo Denniver,

    vielen Dank, dass ist schon mal der Richtige Weg :-)

    ich habe deinen Vorschlag etwas umgeschrieben:

    get-mailbox -Database $Item.Name | where {Bedingung} |
    select samaccountname,Database,@{Name = "TotalItemSize" ; Expression = {(Get-MailboxStatistics $_).TotalItemSize}} | 
    Export-CSV "C:\temp\std_user_nonDatabaseQuota_$Item.csv" 

    Es wird auch die Spalte TotalItemSize dazu geschrieben, aber leider scheint $_ leer zu sein, da keine Daten in die Spalte geschrieben werden. $_.samaccountname, hat leider auch nicht geholfen.

    Gruß

    Uwe

     
    Donnerstag, 4. Oktober 2012 11:38
  • Prinzipiell ist der Code so richtig. $_ kann auch nicht leer sein, sonst hättest du gar keine Ausgabe. Es liegt dann wohl an

    (Get-MailboxStatistics $_).TotalItemSize

    Ich kanns leider nicht testen, aber wenn dein Code oben stimmt, dann sollte auch

    (Get-MailboxStatistics).TotalItemSize

    an der Stelle gehen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 4. Oktober 2012 13:06
    Moderator
  • Hi Denniver,

    ich habe es erst mal so gelöst:

    foreach ($Item in $Database) {
    # write-host $Item
    $User = ""
    $User = get-mailbox -Database $Item.Name | where {$_.UseDatabaseQuotaDefaults -eq $false}
    
        foreach($Quota in $User){
           # write-host $Quota.Name
            $User |select samaccountname,Database,@{Name = "TotalItemSize" ; Expression = {(Get-MailboxStatistics $Quota.Name).TotalItemSize}} |
            Out-File "C:\temp\std_user_nonDatabaseQuota_$Item.txt" -append
            }
    
    }

    ich schau mal ob ich die Datenausgabe noch etwas hübscher bekomme, dann sollte es ok sein.

    Vielen Dank für den Denkanstoss. Ich markiere es mal als gelöst.

    Gruß

    Uwe

    Donnerstag, 4. Oktober 2012 13:17
  • Da Exchange mittlerweile sehr Stark mit PowerShell Administriert wird (und ich auch kein Exchange habe), empfehle ich, solche fragen im Exchange Forum zu stellen:
    http://social.technet.microsoft.com/Forums/de-de/exchange_serverde/threads
    <object height="0" id="plugin0" style=";z-index:1000;" type="application/x-dgnria" width="0"><param name="tabId" value="ff-tab-14" /><param name="counter" value="91" /></object>

    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 4. Oktober 2012 13:47
  • Ach, die ein oder andere Exchangefrage schaffen wir schon, Peter. :)

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 4. Oktober 2012 16:18
    Moderator
  • Moin,

    get-mailbox -Database $Item.Name | where {Bedingung} |
    select samaccountname,Database,@{Name = "TotalItemSize" ; Expression = {(Get-MailboxStatistics $_).TotalItemSize}} |
    Export-CSV "C:\temp\std_user_nonDatabaseQuota_$Item.csv" 

    Get-Mailboxstatistics ist manchmal etwas pingelig, wenn die Shelle "zu schnell ist".

    Probier mal:

    get-mailbox | select samaccountname,Database,@{Name = "TotalItemSize" ; Expression = {start-sleep -Milliseconds 100; (Get-MailboxStatistics $_).TotalItemSize }}

    Es würde mich nicht wundern, wenn Du dann plötzlich zahlen bekommst.

    Es gab in der internen Maillingliste auch mal eine Frage dazu, hat irgendwas mit der Latenz der Abfragen zu den Datenbanken zu tun.


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Donnerstag, 4. Oktober 2012 16:46