Powershell - Export-CSV за пределами l oop печатается / экспортируется только последняя строка - PullRequest
1 голос
/ 28 февраля 2020

Можно ли настроить этот код для экспорта всех строк за пределами foreach l oop:

Это прекрасно работает (внутри l oop):

 $vms = Get-VM | Where { $_.State –eq ‘Running’ } | Select-Object -ExpandProperty Name 

 foreach($vm in $vms) {

    # Get network interface details
    $out = Get-VMNetworkAdapter -vmname $vm | select VMName, MacAddress, IPAddresses

    $vm_name = $out.VMName | Get-Unique
     $ip = ($out.IPAddresses | ForEach-Object {
    $_ | ? {$_ -notmatch ':'}
     }) -join " "
    # If more than 1 MAC , put it in same row separated by space (00:15:5D:58:12:5E 00:15:5D:58:12:5F )

    $mac = ($out.MacAddress | ForEach-Object {
    $_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")
}) -join ' '

$results = @()      

$comp = Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty name

$obj = New-Object -TypeName psobject
$obj | Add-Member -MemberType NoteProperty -Name "VM NAME" -Value $vm_name
$obj | Add-Member -MemberType NoteProperty -Name "IP ADDRESS" -Value $ip
$obj | Add-Member -MemberType NoteProperty -Name "MAC ADDRESS" -Value $mac
$obj | Add-Member -MemberType NoteProperty -Name "HYPER-V HOST" -Value $comp


$results += $obj

Write-Output $results

$results| Export-Csv -Path "c:\1.csv" -NoTypeInformation -append 
}

Однако , когда я перемещаю $results| Export-Csv -Path "c:\1.csv" -NoTypeInformation -append вне l oop, только одна (последняя) строка сохраняется в CSV

Внутри l oop, переменная $results содержит все строки, когда я перемещаю эту переменную за пределы l oop write-host $results печатается только одна (последняя) строка

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Как бы то ни было, ваш код может быть немного сжат. Многие из ваших шагов не являются необходимыми:

$results = Get-VM | Where State –eq Running | Get-VMNetworkAdapter | ForEach-Object {
    [pscustomobject]@{
        'VM NAME'      = $_.VMName
        'IP ADDRESS'   = ($_.IPAddresses -notmatch ':') -join ' '
        'MAC ADDRESS'  = ($_.MacAddress -replace '(..)(..)(..)(..)(..)','$1:$2:$3:$4:$5:') -join ' '
        'HYPER-V HOST' = $env:COMPUTERNAME
    }
}

$results | Export-Csv -Path "c:\1.csv" -NoTypeInformation

Примечания:

  • Вы можете передать виртуальные машины, которые Get-VM возвращает непосредственно в Get-VMNetworkAdapter
  • Если Вы фильтруете по одному свойству, вам не нужен блок скрипта для Where-Object. Where State -eq Running немного легче писать и читать, чем Where { $_.State -eq 'Running' }.
  • $_.IPAddresses -notmatch ':' Операторы типа -notmatch работают с массивами. 'a','b','0','c' -notmatch '\d' вернет 'a','b','c'.
  • То же самое относится и к -replace. 'a0','b1','c2' -replace '\d','' вернет возврат 'a','b','c'. Нет необходимости в foreach циклах.
  • $env:COMPUTERNAME должен быть быстрее, чем использовать WMI для получения имени компьютера
  • Любой объект, который вы создаете в блоке скрипта (например, скрипт ForEach-Object {...}) block) то, что вы сделаете , а не , присваиваете переменную, будет в выводе блока скрипта. Вот почему $results = ... | ForEach-Object {...} работает. Нет необходимости явно создавать массивы с @() и добавлять к ним значения.
  • Приведение таблицы ha sh к [pscustomobject] намного проще, чем использование Add-Member.
0 голосов
/ 28 февраля 2020

Разобрался:

перемещено $results переменная вне l oop (сделайте это "глобальным")

$vms = Get-VM | Where { $_.State –eq ‘Running’ } | Select-Object -ExpandProperty Name 

$results = @()

 foreach($vm in $vms) {

    # Get network interface details

    $out = Get-VMNetworkAdapter -vmname $vm | select VMName, MacAddress, IPAddresses

    # Remove duplicate VM names

    $vm_name = $out.VMName | Get-Unique


    # In case more than 1 IP, put it in same row separated by space (192.168.1.1, 192.168.1.2)


    $ip = ($out.IPAddresses | ForEach-Object {
    $_ | ? {$_ -notmatch ':'}

    }) -join " "

    # If more than 1 MAC , put it in same row separated by space (00:15:5D:58:12:5E 00:15:5D:58:12:5F )

    $mac = ($out.MacAddress | ForEach-Object {
    $_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")
}) -join ' '



$comp = Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty name

$obj = New-Object -TypeName psobject
$obj | Add-Member -MemberType NoteProperty -Name "VM NAME" -Value $vm_name
$obj | Add-Member -MemberType NoteProperty -Name "IP ADDRESS" -Value $ip
$obj | Add-Member -MemberType NoteProperty -Name "MAC ADDRESS" -Value $mac
$obj | Add-Member -MemberType NoteProperty -Name "HYPER-V HOST" -Value $comp


 $results += $obj


}
$results| Export-Csv -Path "c:\1.csv" -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...