Объединить столбцы из разных операторов в одну переменную - PullRequest
0 голосов
/ 22 января 2019

Я готовлю свой отчет о виртуальной машине для клиента, состоящий из этой информации:

$VMs = Get-AzureRmVM -status

$vmOutput = $VMs | ForEach-Object { 
    [PSCustomObject]@{
        "VM Name" = $_.Name
        "VM Type" = $_.StorageProfile.osDisk.osType
        "VM Profile" = $_.HardwareProfile.VmSize
        "Environment" = $_.Tags.Environment
        "Application" = $_.Tags.Application
        "Decommission Date" = $_.Tags.Decomission
        "OS Disk Size" = $_.StorageProfile.OsDisk.DiskSizeGB
        "Data Disks Total Size" = ($_.StorageProfile.DataDisks.DiskSizeGB | Measure -Sum).Sum
        "Data Disks Amount" = ($_.StorageProfile.DataDisks | Measure ).Count
        "Managed OS Disk" = ($_.StorageProfile.OSDisk.ManagedDisk | Measure).Count
        "Managed Data Disks" = ($_.StorageProfile.DataDisks.ManagedDisk | Measure).Count
        "Powerstate" = $_.PowerState
    }
}

После этого оператора выходные данные сохраняются в виде файла CSV:

$vmOutput | sort "Environment", "VM Type", "VM Profile", "Application" | export-csv VMReport.csv -delimiter ";" -force -notypeinformation 

Я хочудобавить частные IP-адреса для каждой виртуальной машины в этот отчет.Единственное решение, которое я нашел для получения такой информации, заключается в следующем:

foreach($nic in $nics)
{
    $vm = $vms | where-object -Property Id -EQ $nic.VirtualMachine.id
    $prv =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress
    Write-Output "$($vm.Name) : $prv"
}

Как можно проанализировать информацию об IP-адресах для каждой виртуальной машины в переменную $ vmOutput перед командой export-csv, чтобы включить оба вывода оператора в одинфайл

1 Ответ

0 голосов
/ 24 января 2019

Когда определите $ vmOutput, добавьте поле-заполнитель (например, "Private IP" ="").

При зацикливании ips вы можете добавить vm name и ip address в хеш-таблицу.

Наконец, вы можете выполнить итерацию $ vmOutput, если vm name совпадает с этим в хеш-таблице, тогда вы можете использовать ip address, хранящийся в хеш-таблице, чтобы заменить тот в $ vmOutput.

Пример кода, как показано нижеи работает на моей стороне:

$VMs = Get-AzureRmVM -ResourceGroupName "xxx" -Status

 $vmOutput = $VMs | ForEach-Object {
 [PSCustomObject]@{
 "VM Name" = $_.name
 "VM Type" = $_.StorageProfile.osDisk.osType
 "VM Profile" = $_.HardwareProfile.VmSize
 "Environment" = $_.Tags.Environment
 "Application" = $_.Tags.Application
 "Decommission Date" = $_.Tags.Decomission
 "OS Disk Size" = $_.StorageProfile.OsDisk.DiskSizeGB
 "Data Disks Total Size" = ($_.StorageProfile.DataDisks.DiskSizeGB | Measure -Sum).Sum
 "Data Disks Amount" = ($_.StorageProfile.DataDisks | Measure ).Count
 "Managed OS Disk" = ($_.StorageProfile.OSDisk.ManagedDisk | Measure).Count
 "Managed Data Disks" = ($_.StorageProfile.DataDisks.ManagedDisk | Measure).Count
 "Powerstate" = $_.PowerState
 "Private IP" ="" #Add the placeholder
 }
 }


 $vms_temp = Get-AzureRmVM -ResourceGroupName "xxx"
 $nics = get-azurermnetworkinterface -ResourceGroupName "xxx"| where VirtualMachine -NE $null
 $ips =@{} #define a hashtable to store vm name and it's private ip


 foreach($nic in $nics){
 $vm = $vms_temp | Where-Object -Property id -EQ $nic.VirtualMachine.id
 $prv = $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress
 $ips.Add($vm.Name,$prv)
 }


 foreach($vm in $vmOutput)
 {

 #if vm name matches, you can use the ip address stored in hashtable to replace the one in $vmOutput
 if($ips.ContainsKey($vm."VM Name"))
 {
 $vm."Private IP"=$ips[$vm."VM Name"]

 }

 }

 $vmOutput | sort "Environment", "VM Type", "VM Profile", "Application" | export-csv d:\VMReport.csv -delimiter ";" -force -notypeinformation 
...