Jump to content

foreach-Schleife, zwei Variablen in Bezug setzen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Hallo,

 

ich bin gerade dabei ein Skript zu basteln, welches zur Automatisierung diverser Livemigration unter Hyper-V dient. Die Thematik HyperV steht aber vorerst hier gar nicht zur Debatte.

Wir haben 6 physikalische HyperV-Server in einem Cluster. Ich möchte mit dem Ausführen des Skriptes ein Gleichgewicht der VMs herstellen, gemessen am Arbeitsspeicher der physikalischen Server. D.h. vor jeder VM-Livemigration soll eine Abfrage stattfinden, welcher Server zum gegenwärtigen Zeitpunkt die größten Speicherressourcen hat. Der Server mit der größten verfügbaren RAM-Kapazität soll die nächste VM erhalten.

 

Das Problem im Detail:

Ich habe folgendes Skript, welches mir bisher den freien physikalischen Arbeitsspeicher von jedem Server preisgibt und danach den maximalen Wert ausgibt:

$Server_gesamt="server1","server2","server3"

$free=foreach ($bla in $Server_gesamt)
{
(( Get-WMIObject Win32_OperatingSystem -ComputerName $bla).FreePhysicalMemory ) /1048576
}

$free | measure-object -max

Jetzt wird mir zwar der Maximalwert ausgegeben, allerdings ohne Bezug zum entsprechenden Server. Mir müsste das Ergebnis aussagen, welcher der drei Server mit diesem Maximalwert in Verbindung zu setzen ist.

 

Ich hoffe ich konnte es einigermaßen klar darstellen und ihr könnt mir ein paar Ansätze liefern.

 

 

 

Vielen Dank im Voraus.

 

Geschrieben (bearbeitet)

Wenn du dies wie oben machen willst würde ich das nicht mit measure-object machen, da dies, wie du schon gemerkt hast, auf den ganzen Script Block zählt und nicht auf ein Objekt. Du könntest dir ein Array bauen, dort Servername und Speicher eintragen und dann das, mit dem höchsten Wert aufgeben oder alle Systeme nach dem gewonnen Wert in $free suchen (dabei auch am besten immer ein Array bauen).

 

Edit: Wieso teilst du durch 1048576?

bearbeitet von Dukel
Geschrieben

Hallo Christoph,
 
Für solche Aufgabenstellungen bietet sich ein selbstdefiniertes [psobject] an

$Names = @("SRV00","SRV01","SRV02")

$Servers = @()
  ForEach($Name in $Names){
  [psobject]$Server = "" | select ServerName,FreePhysicalMemory
     $Server.ServerName = $Name
     $FreePhysicalMemory =  ((Get-WMIObject Win32_OperatingSystem -ComputerName $Name).FreePhysicalMemory) /1MB
     $Server.FreePhysicalMemory = $FreePhysicalMemory.Tostring("0.00")
     $Servers += $Server
   }
 
#Alle Server  
$Servers | ft -auto

#Maximum
$Servers | sort -descending FreePhysicalMemory | select -first 1

----

Ausgabe:

ServerName FreePhysicalMemory
---------- ------------------
SRV00       5,41              
SRV01       6,72              
SRV02       5,26              
        

ServerName FreePhysicalMemory
---------- ------------------
SRV01      6,72        


blub

  • 4 Wochen später...
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...