albertminrich
Goto Top

Powershell foreach-Wert in nachfolgender Abfrage mit ausgeben

Hallo,

Ich führe per foreach für jeden Wert in einem Array einen Befehl aus. Dieser Befehl gibt pro Array-Wert eine oder mehrere Zeilen aus. In jeder dieser Zeilen soll auch der Array-Wert selbst mit ausgegeben werden.

Beispiel:
In dem Array $lwb steht "C:","D:"
Dieser Befehl
foreach ($i in $lwb) {get-wmiobject win32_logicaldisk -filter "name='$i'" | Select-Object freespace,size}  
gibt (zusätzlich zu den Spaltenüberschriften und einer Zeile mit "-----" ) 2 Zeilen aus. Die erste Zeile enthält Informationen zu C:, die zweite zu D:
Also so:
 freespace         size
  ---------         ----
17282424832 254691377152
26703024128  32210153472

Ich möchte eine zusätzliche Spalte, in der jeweils der Laufwerksbuchstabe vorkommt. Also so:
LWB          freespace         size
--------  ---------         ----
C: 17282424832 254691377152
D: 26703024128  32210153472

Ich weiß, das ist kein gutes Beispiel, weil es hier einfach zu lösen ist, indem ich den select-object um "name" ergänze. Nehmt einfach an, "name" gibt es nicht, der Laufwerksbuchstabe muss von der Variable $i kommen.

Danke
Gruß
Martin

Content-ID: 531949

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

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

142232
Lösung 142232 05.01.2020 aktualisiert um 17:23:39 Uhr
Goto Top
gibt (zusätzlich zu den Spaltenüberschriften und einer Zeile mit "-----" ) 2 Zeilen aus. Die erste Zeile enthält Informationen zu C:, die zweite zu D:
Powershell arbeitet objektorientiert und das was du da als Ausgabe erhältst sind in Wirklichkeit Objekte mit deren Eigenschaften und keine Strings
foreach ($i in $lwb) {
    get-wmiobject win32_logicaldisk -filter "name='$i'" | Select-Object @{n='LWB';e={$i}}},freespace,size  
}
Das hier geht auch
foreach ($i in $lwb) {
    get-wmiobject win32_logicaldisk -filter "name='$i'" | %{ [pscustomobject]@{'LWB' = $i; 'Freespace' = $_.freespace; 'Size' = $_.size}}  
}
AlbertMinrich
AlbertMinrich 05.01.2020 um 17:19:24 Uhr
Goto Top
Bin schon selbst einen Schritt weitergekommen.
So geht's:
foreach ($i in $lwb) {$ergebnis = get-wmiobject win32_logicaldisk -filter "name='$i'" | Select-Object freespace,size;write-host $i $ergebnis}  
Führt zu dieser Ausgabe:
c: @{freespace=17272393728; size=254691377152}
h: @{freespace=26703024128; size=32210153472}

Wie kriegt ich jetzt noch das @, die geschweiften Klammern usw. weg?

Danke
Martin
AlbertMinrich
AlbertMinrich 05.01.2020 um 17:25:40 Uhr
Goto Top
Super, genau das hab ich gesucht.

Danke
Martin
AlbertMinrich
AlbertMinrich 05.01.2020 um 18:43:37 Uhr
Goto Top
Hallo, nochmal. Eine Nachfrage hätte ich noch. Geht's auch ohne foreach?

Ich versuch mal, es an meinem tatsächlichen Problem zu erklären. Es geht um Veeam Backup & Replication. Wir sichern jede Menge VM's über verschiedene Job's. Ich möchte per Powershell alle Restorepoints einer bestimmten VM ermitteln und zusätzlich den Erstellungszeitpunkt und den Job mit ausgeben.

Dieser Befehl
Get-VBRBackup -name * | Get-VBRRestorePoint -name VM-Name | Select-Object vmname,creationtime
liefert den VM-Namen un den Erstellungszeitpunkt. Leider gibt der Befehl Get-VBRRestorePoint nicht den Job-Namen mit aus.

Mit serial's Hilfe konnte ich es so lösen:
$myjobs = "Job1","Job2","Job3"  
foreach ($myjob in $myjobs) {Get-VBRBackup -name $myjob | Get-VBRRestorePoint -name VM-Name | Select-Object @{n='Job';e={$myjob}},vmname,creationtime}  

Aber vielleicht geht's ja ganz ohne foreach
Mir fehlt eigentlich nur noch der Teil "was_muss_hier_stehen?"
Get-VBRBackup -name * | Get-VBRRestorePoint -name VM-Name | Select-Object @{n='Job';e={was_muss_hier_stehen?}}vmname,creationtime  

Danke
Martin
142232
Lösung 142232 05.01.2020 aktualisiert um 21:47:19 Uhr
Goto Top
Ins Blaue da ich die Properties der CMDLets nicht vorliegen habe
Get-VBRBackup -PipelineVariable backupjob | Get-VBRRestorePoint -name VM-Name | Select-Object @{n='Job';e={$backupjob.JobName}},vmname,creationtime  
AlbertMinrich
AlbertMinrich 07.01.2020 um 10:47:46 Uhr
Goto Top
Funktioniert einwandfrei.

Danke
Gruß
Martin