none
GB/MB in Byte umwandeln, RRS feed

  • Frage

  • moin,

    bei vielen Exchange CmdLets und Auswertungen erhält man nachfolgende Ergebnisse in MB oder GB.

    get-mailboxstatistics -id "xyz"  | select AttachmentTableTotalSize

    zb. TableTotalSize : 20.81 GB (22,339,747,840 bytes)

    dies kann man schwer bzw. gar nicht im Excel auswerten. Derzeit behelfe ich mir mit eine Funktion die ich im Internet gefunden habe um die Byte zu erhalten.

    gibt es einen einfacheren Weg?

    function Conv2Byte {
    
        $parts = $args[0].ToString().Split(' ')
        $bytesString = $parts[2].TrimStart('(').Replace(',', '')
        $bytes = [long]::Parse($bytesString)
        #Write-Host $bytes -ForegroundColor Green
        return $bytes
    
    }


    Chris

    Freitag, 8. Mai 2020 08:26

Antworten

  • Moin,

    wenn man die Exchange-PowerShell benutzt (ACHTUNG! Das ist keine Empfehlung, nur eine Feststellung!!!), kann man die .Value.ToMB(), .ToGB() usw. Funktionen nutzen, die eine Zahl liefern. In einer Remoting-Session stehen sie freilich nicht zur Verfügung. Da muss man auf Funktionen wie die Deine zurückgreifen, wenn man Zahlen haben möchte.

    Man kann das Gesplitte mit RegEx etwas verschönern:

    if ($arg -match '^.* \((?<bytes>[\d\,]+)\ bytes\)$') {
        $bytes = [long]::Parse($Matches['bytes'])
    }
    aber im Endeffekt ist es das.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Freitag, 8. Mai 2020 09:01
    Freitag, 8. Mai 2020 08:34
  • Wenn Du die Größe erstmal in Bytes hast, kannst Du es ja jederzeit ganz einfach in jede gewünschte andere "Größe" umwandeln.

    $AttachmentTableTotalSize = '20.81 GB (22,339,747,840 bytes)'
    
    $Bytes = [long]::Parse($AttachmentTableTotalSize -replace '^.*\(|\s+bytes\)|,')
    
    '{0:n2} GB' -f ($Bytes /1GB)
    '{0:n2} MB' -f ($Bytes /1MB)
    '{0:n2} KB' -f ($Bytes /1KB)


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:14
    Freitag, 8. Mai 2020 23:26
  • macht du das mit eine RegEx WebSeite - wenn ja welche

    https://regex101.com/

    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:52
    Samstag, 9. Mai 2020 15:41
  • wie kann man sich am besten bei solchen komplizierten RegEx vortasten bzw. diese Schrittweise testen?

    macht du das mit eine RegEx WebSeite - wenn ja welche

    oder macht du das mit -match und testet dich vor?

    Ich mach das schon ne Weile. ;-) So kompliziert ist dieses Regex-Muster gar nicht. Deshalb hab ich dieses auch einfach "zu Fuß" zusammengebaut.

    Das ist der Suchtext: 

    '20.81 GB (22,339,747,840 bytes)'

    Ich möchte alles entfernen, außer der Zahlen, die in Klammern stehen.

    Also schon mal alles vom Anfang des Textes bis einschließlich der öffnenden Klammer:

    '^.*\('

    Dann brauche ich die "Beschreibung innerhalb der Klammer nicht. Also das Leerzeichen und "bytes" inklusiver der schließenden Klammer.

    '\s+bytes\)'

    Jetzt sind nur noch die amerikanischen "Tausender-Trenn-Commata" übrig.

    ','

    Das Alles verkette ich jeweils mit einem "Regex-Oder" '|' und das wars. ;-)

    Edit: Ich hatte auch schon mal einen dicken Wälzer dazu gelesen. Aber wenn ich schnell was nachgucken will, nehme ich meistens https://www.regular-expressions.info und zum Testen https://regex101.com. Da bekommst Du Dein Regex-Muster auch noch schön aufgedröselt.  ;-)


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:52
    • Bearbeitet BOfH-666 Samstag, 9. Mai 2020 15:53
    Samstag, 9. Mai 2020 15:48

Alle Antworten

  • Moin,

    wenn man die Exchange-PowerShell benutzt (ACHTUNG! Das ist keine Empfehlung, nur eine Feststellung!!!), kann man die .Value.ToMB(), .ToGB() usw. Funktionen nutzen, die eine Zahl liefern. In einer Remoting-Session stehen sie freilich nicht zur Verfügung. Da muss man auf Funktionen wie die Deine zurückgreifen, wenn man Zahlen haben möchte.

    Man kann das Gesplitte mit RegEx etwas verschönern:

    if ($arg -match '^.* \((?<bytes>[\d\,]+)\ bytes\)$') {
        $bytes = [long]::Parse($Matches['bytes'])
    }
    aber im Endeffekt ist es das.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Freitag, 8. Mai 2020 09:01
    Freitag, 8. Mai 2020 08:34
  • danke für die INFO

    unter einfacher dachte ich eher an /GB oder so :-)


    Chris

    Freitag, 8. Mai 2020 09:01
  • Wenn Du die Größe erstmal in Bytes hast, kannst Du es ja jederzeit ganz einfach in jede gewünschte andere "Größe" umwandeln.

    $AttachmentTableTotalSize = '20.81 GB (22,339,747,840 bytes)'
    
    $Bytes = [long]::Parse($AttachmentTableTotalSize -replace '^.*\(|\s+bytes\)|,')
    
    '{0:n2} GB' -f ($Bytes /1GB)
    '{0:n2} MB' -f ($Bytes /1MB)
    '{0:n2} KB' -f ($Bytes /1KB)


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:14
    Freitag, 8. Mai 2020 23:26
  • danke für den Tipp Olaf,

    wie kann man sich am besten bei solchen komplizierten RegEx vortasten bzw. diese Schrittweise testen?

    macht du das mit eine RegEx WebSeite - wenn ja welche

    oder macht du das mit -match und testet dich vor?


    Chris

    Samstag, 9. Mai 2020 15:29
  • macht du das mit eine RegEx WebSeite - wenn ja welche

    https://regex101.com/

    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:52
    Samstag, 9. Mai 2020 15:41
  • wie kann man sich am besten bei solchen komplizierten RegEx vortasten bzw. diese Schrittweise testen?

    macht du das mit eine RegEx WebSeite - wenn ja welche

    oder macht du das mit -match und testet dich vor?

    Ich mach das schon ne Weile. ;-) So kompliziert ist dieses Regex-Muster gar nicht. Deshalb hab ich dieses auch einfach "zu Fuß" zusammengebaut.

    Das ist der Suchtext: 

    '20.81 GB (22,339,747,840 bytes)'

    Ich möchte alles entfernen, außer der Zahlen, die in Klammern stehen.

    Also schon mal alles vom Anfang des Textes bis einschließlich der öffnenden Klammer:

    '^.*\('

    Dann brauche ich die "Beschreibung innerhalb der Klammer nicht. Also das Leerzeichen und "bytes" inklusiver der schließenden Klammer.

    '\s+bytes\)'

    Jetzt sind nur noch die amerikanischen "Tausender-Trenn-Commata" übrig.

    ','

    Das Alles verkette ich jeweils mit einem "Regex-Oder" '|' und das wars. ;-)

    Edit: Ich hatte auch schon mal einen dicken Wälzer dazu gelesen. Aber wenn ich schnell was nachgucken will, nehme ich meistens https://www.regular-expressions.info und zum Testen https://regex101.com. Da bekommst Du Dein Regex-Muster auch noch schön aufgedröselt.  ;-)


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Samstag, 9. Mai 2020 15:52
    • Bearbeitet BOfH-666 Samstag, 9. Mai 2020 15:53
    Samstag, 9. Mai 2020 15:48
  • coole Seite, kennt aber scheinbar keine Powershell RegEx

    muss man die RegEx irgendwie unter bestimmten Zeichen setzen?

    String: '20.81 GB (22,339,747,840 bytes)'

    ^.*)       müsste eigentlich   20.81 GB )   finden

    Error

    `^.*(`
    ( Incomplete group structure


    Chris

    Samstag, 9. Mai 2020 15:50
  • upps hab den \ vergessen. klappt super

    Chris

    Samstag, 9. Mai 2020 15:51
  • upps hab den \ vergessen. klappt super
    Schau mal auf die Seite, die ich in meiner anderen Antwort unten noch ergänzt hatte ... dort gibt's ein, wie ich finde, ziemlich gutes Tutorial und gute Erklärungen.

    Live long and prosper!

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

    • Bearbeitet BOfH-666 Samstag, 9. Mai 2020 15:59
    Samstag, 9. Mai 2020 15:58
  • heute war im Script Forum ein ähnlichger thread zu diesem Thema und ein cooler Tipp dabei.

    https://ficilitydotnet.wordpress.com/2013/12/11/exchange-tip-exchangedata-type-bytequantifiedsize/

    # Get BQS value (4.38 MB) in bytes
    [PS] C:\> (Get-MailboxStatistics filip).TotalItemSize.Value.toBytes()
    
    4592642

    https://social.technet.microsoft.com/Forums/en-US/360fd75f-3356-4e68-ac6c-f9eb4b566d69/can-i-convert-this-column-value-to-gb-for-all-values?forum=ITCG


    Chris

    Donnerstag, 14. Mai 2020 16:06
  • heute war im Script Forum ein ähnlichger thread zu diesem Thema und ein cooler Tipp dabei. 

    Das hatte Evgenij in seiner ersten Antwort mit erwähnt. Das funktioniert leider nur, wenn Du die Exchange Powershell local verwendest. Wenn Du die Abfrage remote ausführst, werden die Daten auf dem Remote-System serialisiert und auf Deinem lokalen System wieder de-serialisiert. Dabei geht die Möglichkeit verloren, diese Methode zu benutzen ... unglücklicherweise.  ;-) 

    Live long and prosper!

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

    Donnerstag, 14. Mai 2020 18:51