【问题标题】:Compare historical data in Powershell and output the different values from yesterday to today比较Powershell中的历史数据,输出昨天到今天的不同值
【发布时间】:2019-10-24 22:09:06
【问题描述】:

我有两张表,我需要比较今天的值和昨天的值之间的差异,并告诉我发生了什么变化。注意:我在图片中的两个表格中使用了“今天”和“昨天”而不是日期,但实际表格有日期。

我需要一个 Powershell 脚本,它将获取 DeviceName 和 PowerState 并告诉我昨天和今天之间发生了哪些变化。在示例中,我只需要它告诉我从昨天到今天的变化:“设备 B 已关闭”。然后,我将每天运行该脚本以向我的团队发送电子邮件。该脚本还应该让我知道设备是否从昨天到今天开机。

数据在 SQL 中,在 PowerShell 中,我已将数据从 SQL 中提取到两个单独的 CSV 中,然后将每个 CSV 导入到两个单独的数组中。我正在考虑一个 ForEach 循环来遍历每个设备名称,但我被困在那里。

这是我正在使用的脚本。 (运行查询是我正在加载的模块中的一个函数)。为保护我们,服务器名称已更改为“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'})

这是 CSV 中的设备 B,以证明它们不同:

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

See image of the two tables here

First object in arrays a and b

谢谢!

【问题讨论】:

  • 你已经写过代码了吗?如果是,请将其添加到您的初始帖子中。如果没有,这里提示您如何解决您的任务:Compare-Object / Compare-Object -ReferenceObject ($Table1 | Select-Object -Property 'Device Name', 'PowerState') -DifferenceObject ($Table2 | Select-Object -Property 'Device Name', 'PowerState')
  • @Patrick 我刚刚添加了我正在使用的代码,包括你给我的新比较对象。然而,这没有产生任何结果。我不确定我错过了什么。
  • 您能否检查导入 csv 是否成功,因此变量 $a$b 不为空?你能上传一张$a[0]$b[0]的输出图片吗?
  • 我在数组 a 和 b 中添加了第一个对象的图片。点击帖子底部的链接。我已经验证数组不为空。我已验证 CSV 不为空。

标签: arrays powershell csv datatables compare


【解决方案1】:

老实说,我会在 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 

您将今天使用的查询和昨天唯一使用的查询,将它们加入相同的内容(机器名称或唯一 ID 或...),然后返回电源状态不同的结果.

您最终会得到一个已更改机器的列表,以及它们的当前状态。如果你愿意,你也可以返回 yest.PowerState,但它就是今天不是的。

【讨论】:

  • 这是一个更好的方法!我对此进行了测试,效果很好!你的代码只有一个问题,第一行你写“today.PowerState as is from”这个错误。但是,删除“原样”效果很好!
  • 哎呀!我本来打算昨天以“Was”返回,今天以“Is”返回,但写到一半就意识到这很愚蠢。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 2015-10-09
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多