2017-11-15 4 views
0

Ich habe das folgende PowerShell-VMware-Skript gefunden, das mehrere Informationen aus der Umgebung exportiert.Powershell-Ausgabe - Zeilenumwandlung


&{foreach($vm in (Get-VM)) { 
$vm.ExtensionData.Guest.Net | select -Property @{N='VM';E={$vm.Name}}, 
@{N='Host';E={$vm.VMHost.Name}}, 
@{N='OS';E={$vm.Guest.OSFullName}}, 
@{N='Tools';E={$vm.ExtensionData.Guest.ToolsRunningStatus}}, 
@{N='NicType';E={[string]::Join(',',(Get-NetworkAdapter -Vm $vm | Select-Object -ExpandProperty Type))}}, 
@{N='VLAN';E={[string]::Join(',',(Get-NetworkAdapter -Vm $vm | Select-Object -ExpandProperty NetworkName))}}, 
@{N='IP';E={[string]::Join(',',($vm.Guest.IPAddress | Where {($_.Split(".")).length -eq 4}))}}, 
@{N='Gateway';E={[string]::Join(',',($vm.ExtensionData.Guest.IpStack.IpRouteConfig.IpRoute | %{if($_.Gateway.IpAddress){$_.Gateway.IpAddress}}))}}, 
@{N='Subnet Mask';E={ 
      $dec = [Convert]::ToUInt32($(('1' * $_.IpConfig.IpAddress[0].PrefixLength).PadRight(32, '0')), 2) 
      $DottedIP = $(For ($i = 3; $i -gt -1; $i--) { 
        $Remainder = $dec % [Math]::Pow(256, $i) 
        (      $dec - $Remainder)/[Math]::Pow(256, $i) 
        $dec = $Remainder 
       }) 
      [String]::Join('.', $DottedIP) 
     }}, 
@{N="DNS";E={[string]::Join(',',($vm.ExtensionData.Guest.IpStack.DnsConfig.IpAddress))}}, 
@{N='MAC';E={[string]::Join(',',$_.MacAddress)}}}} 

Die Ausgabe davon ist, in einer folgenden Art: (mehrere hundert dieser "Bausteine", eine pro VM, die zwei von ihnen)

VM   : VMname1 
Host  : ESXi1.domain.com 
OS   : Red Hat Enterprise Linux 6 (64-bit) 
Tools  : guestToolsRunning 
NicType  : Vmxnet3 
VLAN  : 123-DMZ-VMnet 
IP   : 10.10.10.40 
Gateway  : 10.10.10.1 
Subnet Mask : 255.255.255.0 
DNS   : 10.10.10.11,10.10.10.13 
MAC   : 01:50:56:9a:98:62 


VM   : VMname2 
Host  : ESXi2.domain.com 
OS   : Microsoft Windows Server 2012 (64-bit) 
Tools  : guestToolsRunning 
NicType  : Vmxnet3 
VLAN  : 20-VMnet 
IP   : 10.55.10.14 
Gateway  : 10.55.10.1 
Subnet Mask : 255.255.255.0 
DNS   : 10.10.10.11,10.10.10.13,10.20.10.11,10.10.231.13 
MAC   : 12:50:32:22:68:9c 

I habe versucht, einen korrekten Ansatz zu finden, um die Ausgabe in das CSV-Format zu konvertieren: VM, HOST, OS, Tools, NicType, VLAN, IP, Gateway, Subnetzmaske, DNS, MAC VMname1, ESXi1.domain.com, etc VMnam e1, ESXi2.domain.com, usw.

Mit der "Konvertierung Skript", auch im Internet gefunden, die ich versuchte, um meine Bedürfnisse zu erfüllen, versuchte ich, die Informationen zu konvertieren, aber es scheint nicht zu funktionieren .

$list = Get-Content C:\temp\IPs\results.txt 
$i = 0 
Do 
{ 
$VM1 = $list[$i].value 
$Host1 =$list[$i+1].value 
$OS1 =$list[$i+2].value 
$Tools1 =$list[$i+3].value 
$NicType1 =$list[$i+4].value 
$VLAN1 =$list[$i+5].value 
$IP1 =$list[$i+6].value 
$Gateway1 =$list[$i+7].value 
$SubnetMask1 =$list[$i+8].value 
$DNS1 =$list[$i+9].value 
$MAC1 =$list[$i+10].value 
[array]$converter += $VM1 + "," + $Host1 + "," + $OS1 + "," + $Tools1 + "," 
+ $NicType1 + "," + $VLAN1 + "," + $IP1 + "," + $Gateway1 + "," + 
$SubnetMask1 + "," + $DNS1 + "," + $MAC1 
$i = $i + 11 
} while ($i -le $list.count) 
$converter = $converter|convertfrom-csv -header VM1, Host1, OS1, Tools1, 
NicType1, VLAN1, IP1, Gateway1, SubnetMask1, DNS1, MAC1 
$converter|export-csv C:\temp\IPs\results.csv -notypeinformation 

Bitte beachten Sie, dass für einige Einträge wie DNS oder IP-Adresse mehrere Werte vorhanden sein können.

Wie würde ich die Zeilen in Spalten umwandeln, um alle verfügbaren Informationen zu erfassen?

Vielen Dank.

+0

In '$ Converter' warum benutzt du all diese Joins? Verwenden Sie einfach doppelte Anführungszeichen und String-Erweiterungen! '$ Converter =" $ VM1, $ Host1, ... "' – TheIncorrigible1

+0

Die Antwort ist ganz einfach - ich benutze diesen Ansatz, weil ich PowerShell noch nicht gut genug kenne. Es ist tatsächlich eine Lernkurve, die ich gerade durchlaufe, was auch zufällig etwas ist, das ich für Arbeitszwecke bereitstellen muss. Darf ich Sie bitte bitten, anzugeben, welche Zeile im obigen Code ich ersetzen soll? –

+0

Was befindet sich in Ihrer result.txt? – TheIncorrigible1

Antwort

1

Bearbeiten: Im Nachhinein habe ich keine Ahnung, warum der ursprüngliche Autor .Net zu Select-Object Rohrleitung ist, wenn nichts mit diesem Wert getan wird. Ich habe meine Antwort mit einer besseren Darstellung aktualisiert

setzen sie alle zusammen (mit Formatierung):

#Requires -Version 3 

$Collection = ForEach ($VM in (Get-VM)) 
{ 
    $Out = Select-Object -InputObject $VM -Property @(
     @{ N = 'VM' 
      E = {$PSItem.Name} 
     }, 
     @{ N = 'Host' 
      E = {$PSItem.VMHost.Name} 
     }, 
     @{ N = 'OS' 
      E = {$PSItem.Guest.OSFullName} 
     }, 
     @{ N = 'Tools' 
      E = {$PSItem.ExtensionData.Guest.ToolsRunningStatus} 
     }, 
     @{ N = 'NicType' 
      E = {(Get-NetworkAdapter -Vm $PSItem).Type -join ','} 
     }, 
     @{ N = 'VLAN' 
      E = {(Get-NetworkAdapter -Vm $PSItem).NetworkName -join ','} 
     }, 
     @{ N = 'IP' 
      E = {($PSItem.Guest.IPAddress | Where-Object { ($PSItem -split '.').Count -eq 4}) -join ','} 
     }, 
     @{ N = 'Gateway' 
      E = {($PSItem.ExtensionData.Guest.IpStack.IpRouteConfig.IpRoute | Where-Object { $PSItem.Gateway.IpAddress }) -join ','} 
     }, 
     @{ N = 'Subnet Mask' 
      E={ 
       $dec = [Convert]::ToUInt32($(('1' * $PSItem.ExtensionData.Guest.Net.IpConfig.IpAddress[0].PrefixLength).PadRight(32, '0')), 2) 
       $DottedIP = $(For ($i = 3; $i -gt -1; $i--) { 
         $Remainder = $dec % [Math]::Pow(256, $i) 
         (      $dec - $Remainder)/[Math]::Pow(256, $i) 
         $dec = $Remainder 
        }) 
       [String]::Join('.', $DottedIP) 
      } 
     }, 
     @{ N = 'DNS' 
      E = {$PSItem.ExtensionData.Guest.IpStack.DnsConfig.IpAddress -join ','} 
     }, 
     @{ N = 'MAC' 
      E = {$PSItem.MacAddress -join ','} 
     } 
    ) 

    $Out | Export-Csv -Path $Path -NoTypeInformation -Append -Force -Encoding 'UTF8' 
    $Out 
} 

Wenn alles, was Sie kümmern sich um die resultierende CSV ist:

#Requires -Version 3 

Get-VM | 
    Select-Object -Property @(
     @{ N = 'VM' 
      E = {$PSItem.Name} 
     }, 
     @{ N = 'Host' 
      E = {$PSItem.VMHost.Name} 
     }, 
     @{ N = 'OS' 
      E = {$PSItem.Guest.OSFullName} 
     }, 
     @{ N = 'Tools' 
      E = {$PSItem.ExtensionData.Guest.ToolsRunningStatus} 
     }, 
     @{ N = 'NicType' 
      E = {(Get-NetworkAdapter -Vm $PSItem).Type -join ','} 
     }, 
     @{ N = 'VLAN' 
      E = {(Get-NetworkAdapter -Vm $PSItem).NetworkName -join ','} 
     }, 
     @{ N = 'IP' 
      E = {($PSItem.Guest.IPAddress | Where-Object { ($PSItem -split '.').Count -eq 4}) -join ','} 
     }, 
     @{ N = 'Gateway' 
      E = {($PSItem.ExtensionData.Guest.IpStack.IpRouteConfig.IpRoute | Where-Object { $PSItem.Gateway.IpAddress }) -join ','} 
     }, 
     @{ N = 'Subnet Mask' 
      E={ 
       $dec = [Convert]::ToUInt32($(('1' * $PSItem.ExtensionData.Guest.Net.IpConfig.IpAddress[0].PrefixLength).PadRight(32, '0')), 2) 
       $DottedIP = $(For ($i = 3; $i -gt -1; $i--) { 
         $Remainder = $dec % [Math]::Pow(256, $i) 
         (      $dec - $Remainder)/[Math]::Pow(256, $i) 
         $dec = $Remainder 
        }) 
       [String]::Join('.', $DottedIP) 
      } 
     }, 
     @{ N = 'DNS' 
      E = {$PSItem.ExtensionData.Guest.IpStack.DnsConfig.IpAddress -join ','} 
     }, 
     @{ N = 'MAC' 
      E = {$PSItem.MacAddress -join ','} 
     } 
    ) | 
    Export-Csv -Path $Path -NoTypeInformation -Force -Encoding 'UTF8' 
+0

Danke für das Skript. Wenn ich die CSV in eine Excel importieren, sowie wenn ich die Ausgabe im Texteditor öffnen, ist IP-Spalte über alle Zeilen sowie MAC leer. Auch die Spalte GATEWAY enthält den Eintrag "VMware.Vim.NetIpRouteConfigInfoIpRoute" für alle Zeilen anstelle der IP des Gateways. Irgendeine Idee, wie man das korrigiert? –

+0

@VickVega Ich würde vorschlagen, die Eigenschaften einer einzelnen VM zu betrachten und zu sehen, wo die Werte, nach denen Sie suchen, existieren und sie in die Ausdruckblöcke einstecken.'$ VM = @ (Get-VM) [0]' dann '$ VM | Get-Member "und weiter graben, bis Sie die Eigenschaft haben, die Sie brauchen. – TheIncorrigible1

+0

Danke für Ihre Hilfe. Ich war in der Lage, das Problem mit dem ursprünglichen Ansatz, leicht angepasst, zu lösen. Es dauert viel länger zu laufen, aber die Ergebnisse werden korrekt angezeigt. –

0

Der endgültige Arbeitscode lautet:

&{foreach($vm in (get-VM)) { 
$vm.ExtensionData.Guest.Net | select -Property @{N='VM';E={$vm.Name}}, 
@{N='Host';E={$vm.VMHost.Name}}, 
@{N='OS';E={$vm.Guest.OSFullName}}, 
@{N='Tools';E={$vm.ExtensionData.Guest.ToolsRunningStatus}}, 
@{N='NicType';E={[string]::Join(',',(Get-NetworkAdapter -Vm $vm | Select-Object -ExpandProperty Type))}}, 
@{N='VLAN';E={[string]::Join(',',(Get-NetworkAdapter -Vm $vm | Select-Object -ExpandProperty NetworkName))}}, 
@{N='IP';E={[string]::Join(',',($vm.Guest.IPAddress | Where {($_.Split(".")).length -eq 4}))}}, 
@{N='Gateway';E={[string]::Join(',',($vm.ExtensionData.Guest.IpStack.IpRouteConfig.IpRoute | %{if($_.Gateway.IpAddress){$_.Gateway.IpAddress}}))}}, 
@{N='Subnet Mask';E={ 
      $dec = [Convert]::ToUInt32($(('1' * $_.IpConfig.IpAddress[0].PrefixLength).PadRight(32, '0')), 2) 
      $DottedIP = $(For ($i = 3; $i -gt -1; $i--) { 
        $Remainder = $dec % [Math]::Pow(256, $i) 
        (      $dec - $Remainder)/[Math]::Pow(256, $i) 
        $dec = $Remainder 
       }) 
      [String]::Join('.', $DottedIP) 
     }}, 
@{N="DNS";E={[string]::Join(',',($vm.ExtensionData.Guest.IpStack.DnsConfig.IpAddress))}}, 
@{N='MAC';E={[string]::Join(',',$_.MacAddress)}} 
    } 
} | ft -AutoSize | Out-String -Width 4096 | Out-File C:\temp\VM-GetSomeInfo.txt