none
Powershell 3.0, -eq -like RRS feed

  • Frage

  • moin,

    ist das ein BUG? Der Befehl ist aus der TechNet HIlfe

    https://technet.microsoft.com/en-us/library/jj863439(v=exchg.150).aspx

    Get-MailboxStatistics -database huser | Where {$_.DisconnectReason -eq "Disabled"} | ft DisplayName,Database,DisconnectDate,disconnectreason

    kein Ergebniss

    Get-MailboxStatistics -database huser | Where {$_.DisconnectReason -like "Disabled*"} | ft DisplayName,Database,DisconnectDate,disconnectreason

    liefert korrekt ein Ergebnis

    noch ein kurze Frage: seit Powershell 3.0 sollte ja $DisconnectReason als Schreibweise möglich sein?


    Chris

    Dienstag, 26. Juli 2016 08:53

Antworten

  • OK, hier die Auflösung.

    Der im OP zitierte Artikel bezog sich auf Exchange 2013, und da, siehe meinen Post mit Screenshots, funktionierte der Befehl auch so.

    Bei Exchange 2016 hat sich das Objekt-Modell offenbar etwas verändert.

    Gleich vorab: Was dennoch funktioniert, ist das Ersetzen von -eq durch -like ohne Stern.

    Hier noch einmal bildlich:

    Exchange 2013:

    Somit ist der eigentliche Wert auch hier Integer, und der Lietralwert wird aus einer Enumeration bezogen.

    Exchange 2016:

    Hier wird die Konvertierung also durch die Ansprache von "Value" ausgelöst. Versteckte Sonderzeichen gibt es nicht:

    Wenn man also den obigen Befehl an Exchange 2016 anpassen möchte, verwendet man entweder -like statt -eq (würde ich bei Strings vermutlich eh machen, aber das ist meine persönliche, von SQL versaute Marotte), oder man schreibt:


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert -- Chris -- Mittwoch, 27. Juli 2016 13:26
    Mittwoch, 27. Juli 2016 12:58

Alle Antworten

  • > Get-MailboxStatistics -database huser | Where {$_.DisconnectReason*-eq
    > "Disabled"} *| ft DisplayName,Database,DisconnectDate,disconnectreason
     
    Steht in DisconnectReason literal "Disabled" drin?
     
    > noch ein kurze Frage: seit Powershell 3.0 sollte ja $DisconnectReason
    > als Schreibweise möglich sein?
     
    Meinst Du ( Get-MailboxStatistics ).DisconnectReason? Also der direkte
    Zugriff auf eine einzelne Eigenschaft einer Objektcollection?
     
    Dienstag, 26. Juli 2016 10:35
  • ja, aber ich erkenne nicht ob eventl. Leerzeichen am Ende stehen. -eq bringt keine Ergebnis?


    Chris

    Dienstag, 26. Juli 2016 10:45
  • ja, aber ich erkenne nicht ob eventl. Leerzeichen am Ende stehen. -eq bringt keine Ergebnis?

    Kannst ja [int[]][char[]]($_.DisconnectReason) ausgeben lassen, dann siehst Du's ;-)


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 26. Juli 2016 10:51
  • bin leider mit dem Tip nicht klar gekommen? wo wie gehört das geschieben.

    ein Entwickler Kollege hat mir geholfen. Im wert steht "Disabled" mit -eq kommt nicht zurück. Es dürfte ein BUG sein?


    Chris

    Dienstag, 26. Juli 2016 11:42
  • Moin,

    ich habe gerade keine im Status "Disabled", aber mit "SoftDeleted" funktioniert auch -eq .


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 26. Juli 2016 11:51
  • keine Leerzeichen. Am Screenshot erkennt man gut das mit -eq kein Ergebnis geliefert wird.

    $users = Get-MailboxStatistics -database user | Where {$_.DisconnectReason -like "Disabled*"}
    foreach ($user in $users) { write-host ("[{0}]" -f $user.disconnectreason) }
    [Disabled]
    [Disabled]
    [Disabled]
    [Disabled]


    Chris

    Dienstag, 26. Juli 2016 12:04
  • Hallo,

    dann solltest du dir einmal eine dieser Eigenschaften genauer ansehen, indem du sie mit

    $a = (Get-MailboxStatistics -database user | Where {$_.DisconnectReason -like "Disabled*"} | select -first 1).DisconnectReason

    in eine Variable speicherst. Ist das wirklich ein String? Also $a.Gettype(). Schau mal, ob $a.Length genau der Anzahl an Buchstaben entspricht. Vielleicht ist dort noch irgendwas unsichtbares am Ende, irgendein Steuerzeichen. 

    Viele Grüße

    Christoph

    Mittwoch, 27. Juli 2016 09:57
  • [PS] C:\WINDOWS\system32>$a = (Get-MailboxStatistics -database user | Where {$_.DisconnectReason -like "Disabled*"} | select -first 1).DisconnectReason
    [PS] C:\WINDOWS\system32>$a.Gettype()

    IsPublic IsSerial Name                                     BaseType
    -------- -------- ----                                     --------
    True     True     Int32                                    System.ValueType


    [PS] C:\WINDOWS\system32>$a.Length
    1
    [PS] C:\WINDOWS\system32>


    Chris

    Mittwoch, 27. Juli 2016 10:03
  • Moin,

    also zumindest bei Exchange 2013 funktioniert es:

    Der Typ ist allerdings wirklich nicht String, sondern MailboxState:

    Ich schau mal auf Exchange 2016.


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Mittwoch, 27. Juli 2016 10:16
  • > True     True     Int32                                    System.ValueType
     
    Jetzt hätt ich gern nen Exchange zum Spielen. Warum ist das ein Int32,
    wenn doch weiter oben das hier rauskam:
     
    foreach ($user in $users) { write-host ("[{0}]" -f $user.disconnectreason) }
    [Disabled]
     
     
    Mittwoch, 27. Juli 2016 10:18
  • > Der Typ ist allerdings wirklich nicht String, sondern MailboxState:
     
    Das könnte es erklären... :-) Je nach dem, was bei ToString() rauskommt.
    Warum ist's im Post von Chris aber ein Int32?
     
    Mittwoch, 27. Juli 2016 10:37
  • Der BaseType von MailboxState ist mit System.Enum angegeben. Demnach könnte der Enum-Index eine Int32 sein.
    Mittwoch, 27. Juli 2016 12:21
  • Evgenij,

    eine Frage zum Delete. Wenn man ein Postfach in der GUI mit dem Papierkorb löscht wird ja auch der User im AD gelöscht. Eigentlich ein viel gefährlicher Vorgang als "... disable" der aber über die GUI leichter erreichbar ist. Ausserdem erscheint kein Wert unter DisconnectReason. Müsste da nicht ebenfalls etwas stehen?

    zb. Harddelete oder Softdelete- weil ja der User auch gelöscht wird?


    Chris


    Mittwoch, 27. Juli 2016 12:43
  • OK, hier die Auflösung.

    Der im OP zitierte Artikel bezog sich auf Exchange 2013, und da, siehe meinen Post mit Screenshots, funktionierte der Befehl auch so.

    Bei Exchange 2016 hat sich das Objekt-Modell offenbar etwas verändert.

    Gleich vorab: Was dennoch funktioniert, ist das Ersetzen von -eq durch -like ohne Stern.

    Hier noch einmal bildlich:

    Exchange 2013:

    Somit ist der eigentliche Wert auch hier Integer, und der Lietralwert wird aus einer Enumeration bezogen.

    Exchange 2016:

    Hier wird die Konvertierung also durch die Ansprache von "Value" ausgelöst. Versteckte Sonderzeichen gibt es nicht:

    Wenn man also den obigen Befehl an Exchange 2016 anpassen möchte, verwendet man entweder -like statt -eq (würde ich bei Strings vermutlich eh machen, aber das ist meine persönliche, von SQL versaute Marotte), oder man schreibt:


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert -- Chris -- Mittwoch, 27. Juli 2016 13:26
    Mittwoch, 27. Juli 2016 12:58
  • super, danke da kommt man nie drauf.

    sollte man im TechNet Artikel anpassen.


    Chris

    Mittwoch, 27. Juli 2016 13:26
  • > Hier wird die Konvertierung also durch die Ansprache von "Value" ausgelöst.
     
    ScriptProperty $this.ToString() :-)))
     
    Donnerstag, 28. Juli 2016 15:23