Сравните исторические данные в Powershell и выведите различные значения со вчерашнего дня до сегодняшнего дня. - PullRequest
0 голосов
/ 25 октября 2019

У меня есть две таблицы, в которых мне нужно сравнить разницу между сегодняшним значением и вчерашним значением и сказать, что изменилось. Примечание. Я использовал «Сегодня» и «Вчера» вместо дат в двух таблицах в изображении, но фактические таблицы имеют даты.

Мне нужен сценарий Powershell, который будет принимать DeviceName и PowerState и сообщать мнекоторый изменился между вчера и сегодня. В этом примере мне нужно только сообщить мне изменение со вчерашнего дня на сегодняшнее: «Устройство B выключено». Затем я буду запускать этот скрипт ежедневно, чтобы отправить электронное письмо моей команде. Сценарий также должен сообщить мне, было ли устройство включено со вчерашнего дня до сегодняшнего дня.

Данные в SQL, в PowerShell, я извлек данные из SQL и в два отдельных CSV, затем импортировал каждый CSV вдва отдельных массива. Я думаю о цикле ForEach, чтобы пройти через каждое имя устройства, но я застрял там.

Вот сценарий, который я использую. (Run-Query - это функция в модуле, который я загружаю). Имя сервера было изменено на «ServerA» для нашей защиты.

Import-Module TeamTools -DisableNameChecking

$YD=(Get-date (get-date).AddDays(-1) -Format "MM-dd-yyyy")
$TD=Get-Date -Format "MM-dd-yyyy"

$YData=Run-query -server ServerA -database Inventory -query "SELECT DeviceName,Powerstate FROM DeviceInventoryHistory WHERE SampleDate = '$YD' ORDER BY DeviceName"
$TData=Run-query -server ServerA -database Inventory -query "SELECT DeviceName,Powerstate FROM DeviceInventory WHERE SampleDate = '$TD' ORDER BY DeviceName"

$YData | Export-Csv -Path C:\Temp\YData.csv -NoTypeInformation
$TData | Export-Csv -Path C:\Temp\TData.csv -NoTypeInformation

$a=Import-CSV -Path C:\Temp\TData.csv
$b=Import-CSV -Path C:\Temp\YData.csv

Compare-Object -ReferenceObject ($a | Select-Object -Property 'DeviceName','PowerState') -DifferenceObject ($b | Select-Object -Property 'DeviceName','PowerState')

Я также пытался выделить запись из массива и ничего не дал:

Compare-Object -ReferenceObject ($b | Where-Object {$_.DeviceName -eq 'Device B'}) -DifferenceObject ($a | Where-Object {$_.DeviceName -eq 'DeviceB'})

также пробовалиспользуя данные SQL (без CSV)

Compare-Object -ReferenceObject ($YData | Select-Object -Property 'DeviceName','PowerState' | Where-Object {$_.DeviceName -eq 'Device B'}) -DifferenceObject ($TData | Select-Object -Property 'DeviceName','PowerState' | Where-Object {$_.DeviceName -eq 'Device B'})

Вот устройство B из CSV для доказательства того, что они разные:

PS C:\Windows\system32> $b | Where-Object {$_.DeviceName -eq 'Device B'}

DeviceName      Powerstate   
----------      ----------  
Device B        Powered Off

PS C:\Windows\system32> $a | Where-Object {$_.DeviceName -eq 'Device B'}

DeviceName      Powerstate  
----------      ----------  
Device B        Powered On

См. изображение двухтаблицы здесь

Первый объект в массивах a и b

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2019

Честно говоря, я бы сделал это в SQL.

Select today.DeviceName, today.PowerState from
(SELECT DeviceName,Powerstate FROM DeviceInventoryHistory WHERE SampleDate = '$YD') as yest join (SELECT DeviceName,Powerstate FROM DeviceInventoryHistory WHERE SampleDate = '$TD') as today on yest.DeviceName = today.DeviceName where yest.Powerstate <> today.Powerstate 

Вы берете запрос, который вы использовали на сегодня, и единственный, который вы использовали для вчерашних дней, присоединяйтесь к ним на то же самое (имя компьютера илиуникальный идентификатор или ...), а затем вернуть результаты, где состояние питания отличается.

В итоге вы получите список машин, которые изменились, и их текущее состояние. Если хотите, вы также можете вернуть yest.PowerState, но это не то, что сегодня не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...