Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Powershell: vraagje over Sort -Unique en Maximum Value

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

een eenvoudige vraag wellicht voor de Powershell veteranen onder jullie.

Ik heb volgende output, verkregen via een PS script, met in table formaat de whitespace in de verschillende databases van een Exchange 2007:

DB FREEMB
First Storage Group\EXCHANGE Mailbox Database 1 3001
First Storage Group\EXCHANGE Mailbox Database 1 2966
First Storage Group\EXCHANGE Mailbox Database 1 2801
Third Storage Group\EXCHANGE Mailbox Database 2 1536
Third Storage Group\EXCHANGE Mailbox Database 2 1488
Third Storage Group\EXCHANGE Mailbox Database 2 1386
Second Storage Group\EXCHANGE Public Folder Database 300
Second Storage Group\EXCHANGE Public Folder Database 288

Zoals je ziet, staan alle exchange databases dubbel in de lijst, met telkens hun vrijgemaakte whitepace in MB op dat moment. De data uit deze table is namelijk afkomstig uit achtereenvolgende event log ID's 1221.

Ik zou nu graag deze duplicate databases willen schrappen, ik vermoed via "Sort DB -Unique", MAAR tegelijk zou ik ook willen dat deze sort -unique resulteert in de rij waarin de hoogste waarde van FREEMB staat voor die databasenaam.
Dit is namelijk de meest actuele en dat is het enige wat ons interesseert.
Ik heb er al even op gezocht, maar slaag er niet in om enkel de rijen met de maximum value van FreeMB te laten weergeven...

Dus: hoe laat je een Sort -Unique voor een parameter in een kolom gebeuren op basis van een maximum value in een andere kolom?

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 17-11 22:19
Ik ben niet zo'n Exchange persoon, maar werk wel veel met powershell.
Wat voor type data is dit eigenlijk? Zit dit in een array of is het plain tekst output?
Wellicht kun je een stukje van je script posten?

Computer says no


Verwijderd

Topicstarter
Script komt van internet:

Function Get-ExchangeWhiteSpace {

# Convert Dates to WMI CIM dates
$tc = [System.Management.ManagementDateTimeconverter]
$Start =$tc::ToDmtfDateTime( (Get-Date).AddDays(-3).Date )
$End =$tc::ToDmtfDateTime( (Get-Date).Date)

# Create two calculated properties for InsertionStrings values
$DB = @{Name="DB";Expression={$_.InsertionStrings[1]}}
$FreeMB = @{Name="FreeMB";Expression={[int]$_.InsertionStrings[0]}}

Get-WMIObject Win32_NTLogEvent -Filter "LogFile='Application' AND EventCode=1221 AND TimeWritten>='$Start' AND TimeWritten<='$End'" | Select-Object ComputerName,$DB,$FreeMB | Sort-Object FreeMB -Unique -Descending

het enige wat ik nog verder in het script doe, is de functie uitvoeren op de lokale computer EXCHANGE en de weergave bepalen

Get-ExchangeWhiteSpace -ComputerName EXCHANGE | convertto-HTML -property ComputerName,DB,FreeMB

  • Kalush
  • Registratie: Januari 2007
  • Nu online
Het script leest de afgelopen 3 dagen uit in je evenvtwr. Als de exchange maintanance dan 3 keer gelukt is krijg je drie resultaten terug. Deze zijn niet uniek.
Je moet bij powershell (indien mogelijk) zo vroeg mogelijk filteren.
Voordat je resultaat gemaakt is, moet je dus eigenlijk al filteren. Kan je het beste een "-first" doen bij de Select-Object.
dus ipv
Select-Object ComputerName,$DB,$FreeMB
naar:
Select-Object ComputerName,$DB,$FreeMB -First 1

(kan ook zijn dat je "-last 1" moet gebruiken, weet niet meer precies hoe die gefilterd werd vanuit wmi
en anders kan je voor de select eerst nog een sort doen op de datum van het event)

Verwijderd

Topicstarter
thx voor de moeite maar helaas
dat zou lukken indien in de DB kolom slechts 1 soort database stond, maar bij de meeste exchange 2007 servers zijn het er minstens 2 (1 mailbox DB en 1 public folder DB).

ik zou dus op een of andere manier de FreeMB property moeten kunnen koppelen aan de DB property en hierna de duplicates schrappen via Sort/Select -Unique

  • Kalush
  • Registratie: Januari 2007
  • Nu online
Hmm, kan dat niet helemaal voorkauwen (want heb geen exchange beschikbaar om te testen).

Maar dan zou je bijvoorbeeld alle resultaten in een object zetten;

$DataWhiteSpace = Get-ExchangeWhiteSpace -ComputerName EXCHANGE
En dan van alle databases die je hebt (Get-MailboxDatabase -Server EXCHANGE) en een ForEach-Object maken en data uit de $DataWhiteSpace object halen.

Heb het ooit wel voor elkaar gekregen om (voor mijn eigen inzicht) een overzicht te krijgen met alle databases (ook public folders), *.mdb grootte op schijf, whitespace volgens eventvwr, aantal mailboxen, gemiddeld gebruik etc. Maar kan 'm niet meer vinden. Helaas...
Pagina: 1