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

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.

 

Link zu diesem Kommentar

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
Link zu diesem Kommentar

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

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

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...