Сравнение массивов в Powershell - PullRequest
0 голосов
/ 15 апреля 2020

Я ищу следующие шаги:

  • Чтение в файле CSV
    • Добавление содержимого из файла CSV в массив
  • Сравните содержимое из CSV с содержимым из другого массива
  • Если элементы в массиве не являются членами массива CSV
    • Отправить сообщение по электронной почте

Сначала я попытался запустить сценарий с одним хостом, отсутствующим в файле CSV Reports2, этот отсутствующий хост был отображен на консоли и записан в файл Reports2, но все еще при повторном запуске кода он по-прежнему отображает последний элемент (хост, который отсутствовал в Reports2.CSV):

Это сценарий, над которым я сейчас работаю:

РЕДАКТИРОВАТЬ: я отредактировал фрагмент кода для отражения рабочего решения

$user = ''
$pswd = ''
$vCenter_Servers = ""
$now = Get-Date
$start = $now.AddDays(-15)
$esxiHosts = Import-CSV C:\Scripts\Report1.csv #Reading CSV File

$MaitanceMode = @()
$Ticket = @()

foreach($ESXI in $esxiHosts){
 $Ticket += $ESXI | Select-Object -ExpandProperty Name
}

foreach($vCenter in $vCenter_Servers) {

$srv = Connect-VIServer -Server $vCenter -User $user -Password $pswd
Get-VMHost -PipelineVariable esx -Server $srv |  Where-Object {$_.ConnectionState -eq 'Maintenance'} |


ForEach-Object -Process {

    $maintEntered = Get-VIEvent -Entity $esx -Start $start -MaxSamples ([int]::MaxValue) -Server $srv |

         Where-Object{$_ -is [VMware.Vim.EnteredMaintenanceModeEvent]}

    if($maintEntered){  
     #Skipping
    }
    else {

         $MaitanceMode += $esx | Select-Object -ExpandProperty Name

         }

   }
} #Ending ForEach Loop

$NoTicket = $MaitanceMode | Where {$Ticket -Contains $_}
$NoTicket

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Несмотря на принятый ответ от @ Thomas , не правильно использовать оператор присваивания увеличения (+=) для создания коллекции в PowerShell. С одной стороны, это очень дорогой синтаксис.
см .: Почему бы не использовать оператор присваивания увеличения (+=) для создания коллекции .

Чтобы построить коллекцию объектов в PowerShell, вы должны использовать конвейер PowerShell, удалив <variable> += соответствующих команд (это приведет к тому, что объекты останутся в конвейере) и перехватить всю коллекцию, добавив <variable> = перед итератора (например, Foreach-Object). При использовании этого синтаксиса PowerShell нет необходимости инициировать массивы (<variable> = @()).
Взяв в качестве примера ваш скрипт:

$user = ''
$pswd = ''
$vCenter_Servers = ""
$now = Get-Date
$start = $now.AddDays(-15)
$esxiHosts = Import-CSV C:\Scripts\Report1.csv #Reading CSV File

$Ticket = foreach($ESXI in $esxiHosts){
    $ESXI | Select-Object -ExpandProperty Name
}

foreach($vCenter in $vCenter_Servers) {

$srv = Connect-VIServer -Server $vCenter -User $user -Password $pswd
Get-VMHost -PipelineVariable esx -Server $srv |  Where-Object {$_.ConnectionState -eq 'Maintenance'} |


$MaitanceMode = ForEach-Object -Process {

    $maintEntered = Get-VIEvent -Entity $esx -Start $start -MaxSamples ([int]::MaxValue) -Server $srv |

         Where-Object{$_ -is [VMware.Vim.EnteredMaintenanceModeEvent]}

    if($maintEntered){  
     #Skipping
    }
    else {

         $esx | Select-Object -ExpandProperty Name

         }

   }
} #Ending ForEach Loop

$NoTicket = $MaitanceMode | Where {$Ticket -Contains $_}
$NoTicket
0 голосов
/ 15 апреля 2020

Вы должны создать свой массив, содержащий результаты, в виде пустого массива, вероятно, до ForEach-Object -Process {... с $MaitanceMode = @(), и когда вы хотите добавить в него элементы, замените эту строку:

$MaitanceMode = $esx | select name

на

$MaitanceMode += $esx | select name

Редактировать:

Далее заменить эту строку:

$esxiHosts = Import-CSV C:\Scripts\Report2.csv

на эту строку:

$esxiHosts = Import-CSV C:\Scripts\Report2.csv | Select-Object -ExpandProperty Name

и эту строку:

$MaitanceMode += $esx | select name

по этой строке:

$MaitanceMode += $esx | Select-Object -ExpandProperty Name

И не забудьте создать экземпляр $MaitanceMode как пустой массив. Это сейчас обязательно. В противном случае он станет строкой, а не массивом.

...