derhoeppi
Goto Top

Powershell Import-CSV

Hallo Leute,

nachdem wir gestern bereits ein Problem bei einer Filterbedingung gelöst haben, möchte ich nun ein anderes Skript, welches ebenfalls auf die CSV zugreift erweitern. Meine CSV-Datei enthält folgende Werte: VMName, Powerstate, VMHost. Die CSV enthält ca. 500 VM's. Darunter befindet sich ebenfalls mein vCenter und der SQL Server auf dem die vCenter Datenbank liegt. Wie bekomme ich es im Skript hin, dass mir der Host dieser beiden Server genannt wird?

Gruß
derhoeppi

Content-Key: 210915

Url: https://administrator.de/contentid/210915

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: colinardo
colinardo 09.07.2013 aktualisiert um 09:56:21 Uhr
Goto Top
Hello again derhoeppi,
sind zwar nur spärliche Infos die du hier lieferst aber im groben und ganzen so:
$csv = import-csv "C:\test.csv"  
$csv | ?{$_.Name -eq "nameDeinesvCenterServer"} | select VMHost  

Grüße Uwe
Mitglied: derhoeppi
derhoeppi 09.07.2013 um 10:51:43 Uhr
Goto Top
Hallo Uwe,

ich habe meinen Fehler gefunden. Ich habe in einer Variablen den DNS Namen des vCenters stehen. In der CSV steht jedoch nur der Anzeigename, so dass die Option -eq nie gegriffen hat. Ich hätte es durch ein -like ersetzen sollen.
Mit dem Skript möchte ich den Host ermitteln auf dem die VM zum Zeitpunkt der CSV Erstellung lief. Nach einem Shutdown des RZ möchte ich bestimmte Maschinen wieder hochfahren. Da ich zu diesem Zeitpunkt noch kein vCenter zur Verfügung habe, möchte ich mich direkt auf den Host verbinden um das vCenter + SQL Server bzw. eine vApp zu starten. Dazu muss ich die Hosts ermitteln. Gleiches gilt zum Beispiel für einen RZ Shutdown,
Mitglied: kontext
kontext 09.07.2013, aktualisiert am 10.07.2013 um 09:33:48 Uhr
Goto Top
Zitat von @derhoeppi:
ich habe meinen Fehler gefunden. ....
@@---Somit sollte das Problem gelöst sein, richtig?
Dann wäre es noch hilfreich die Frage auch als gelöst zu markieren:

Da kommt doch noch was (Siehe unten) ...
... da kam der Moderator zu früh in mir zum Vorschein face-smile

Gruß
@kontext
Mitglied: derhoeppi
derhoeppi 09.07.2013 um 11:10:55 Uhr
Goto Top
Hallo Uwe,

wenn ich den Import mit dem entsprechenden VMHost in eine Variable schreiben lasse, gibt mir die Variable folgenden Inhalt aus: @{VMHost=VMHostName}. Damit kann ich leider kein Connect-VIServer machen. Warum wird @{VMHost=...} mit in die Variable aufgenommen?

Gruß
derhoeppi

@kontext: Es hat schon seinen Grund weshalb ich diesen Thread nicht als gelöst markiert habe.
Mitglied: colinardo
colinardo 09.07.2013 um 11:21:16 Uhr
Goto Top
Weil das Ergebnis ein PSCustomObject ist. Um nur den Inhalt zu erhalten musst du die Eigenschaft "expandieren":
$var = $csv | ?{$_.Name -eq "nameDeinesvCenterServer"} | select -ExpandProperty VMHost  
Mitglied: derhoeppi
derhoeppi 09.07.2013 um 12:30:39 Uhr
Goto Top
Hallo Uwe,

super vielen Dank. Eine letzte Frage habe ich noch. In meiner CSV habe ich die Spalte VMHost. In einem Cluster sind meinetwegen 3 Hosts. Kann ich über eine Bedingung die VM's zu einem Host filtern, so dass ich zum Beispiel die VM's auf dem Host herunterfahren oder Starten kann? Vermutlich werde ich hier mit foreach arbeiten müssen?

Gruß
derhoeppi
Mitglied: colinardo
colinardo 09.07.2013 um 12:36:10 Uhr
Goto Top
wo stehen die die 3 Hosts ? in einer zusätzlichen Spalte ? mit welchem Trennzeichen voneinander getrennt?
Filtere den Cluster dann musst du mit Split den String mit den Hosts zerlegen und dieses Array mit einer Foreach-Schleife durchlaufen.
Mitglied: derhoeppi
derhoeppi 10.07.2013 aktualisiert um 08:22:31 Uhr
Goto Top
Hallo Uwe,
der Cluster ist nicht in der CSV vermerkt. Nur VMName, Host der VM und Powerstatus.

Ich importiere zum Anfang die CSV-Datei folgendermaßen.

$VMHosts = Import-Csv "CSVDatei.csv" | Select -ExpandProperty VMHosts - unique

Damit erhalte ich die Hosts in der Variablen $VMHosts, die ich nun als Array ansprechen kann. Nun muss ich nur noch in einer Foreach Schleife die Hosts entsprechend auswählen und die VM's auf diesen Hosts erneut importieren, damit ich einen neuen Filter erhalte.

Gruß
derhoeppi
Mitglied: colinardo
colinardo 10.07.2013 aktualisiert um 08:24:45 Uhr
Goto Top
Ich verstehe immer noch nicht ganz wo das Problem liegt. Im vorigen Post habe ich das doch beschrieben:
$VMHosts = Import-Csv "CSVDatei.csv" | ?{$_.VMName -eq "NamedergesuchtenVM"} | Select -ExpandProperty VMHosts  
(?{} ist eine Abkürzung für ein Where-Object)
Dies liefert in der Variablen $VMHosts ein Array von Strings nur mit dem Namen der Hosts. Dies kannst du dann wieder mit einer Schleife durchlaufen:
$VMHosts | %{echo $_}
(%{} ist eine Abkürzung für ein Foreach-Object)

Zitat:
Select ist ja nur ein Anzeigefilter,
Stimmt so nicht:
Mit dem Cmdlet "Select-Object" werden nur die angegebenen Eigenschaften eines Objekts oder Satzes von Objekten abgerufen. Er kann auch eindeutige Objekte aus einem Array von Objekten oder eine angegebene Anzahl von Objekten vom Anfang oder Ende eines Arrays von Objekten auswählen.
Wenn Sie angegebene Eigenschaften mit Select-Object auswählen, werden die Werte dieser Eigenschaften aus den Eingabeobjekten kopiert und neue Objekte erstellt, die über die angegebenen Eigenschaften und kopierten Werte verfügen.

Grüße Uwe
Mitglied: derhoeppi
derhoeppi 10.07.2013 um 08:56:48 Uhr
Goto Top
So das ganze habe ich nun gelöst. Funktioniert einwandfrei in meiner Testumgebung.
Um das ganze Script noch übersichtlicher zu machen, möchte ich noch mehr Scriptteile in Functionen auslagern. Ich habe nun eine Funktion, die sich um den Verbindungsaufbau zum VMware Host kümmert.

Relativ simpel mit: Connect-VIServer -Server $VMHost
Nun lese ich aber in der obigen Function die VMware Hosts in eine Variable / Array mit der Bezeichnun $Hosts. Wie kann ich diesen Wert an die Funktion zum Verbindungsaufbau übergeben.

Gruß
derhoeppi
Mitglied: colinardo
colinardo 10.07.2013 aktualisiert um 09:10:50 Uhr
Goto Top
function deineFunction($arrHosts){
...
...
}
Aufruf mit Parametern erfolgt dann so
deineFunction $Hosts
oder so
deineFunction -arrHosts $Hosts
face-wink Uwe
Mitglied: derhoeppi
derhoeppi 10.07.2013 um 09:25:54 Uhr
Goto Top
Hallo Uwe,

vielen Dank für das extrem schnelle Feedback. Ich markiere den Beitrag nun als gelöst, weil alle Fragen geklärt sind.

Gruß
derhoeppi