Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 比较Powershell中的历史数据,并输出从昨天到今天的不同值_Arrays_Powershell_Csv_Datatables_Compare - Fatal编程技术网

Arrays 比较Powershell中的历史数据,并输出从昨天到今天的不同值

Arrays 比较Powershell中的历史数据,并输出从昨天到今天的不同值,arrays,powershell,csv,datatables,compare,Arrays,Powershell,Csv,Datatables,Compare,我有两个表格,我需要比较今天的价值和昨天的价值之间的差异,并告诉我发生了什么变化。注意:我在图中的两个表中使用了今天和昨天,而不是日期,但是实际的表中有日期 我需要一个Powershell脚本,它将采用DeviceName和PowerState,并告诉我昨天和今天之间发生了哪些变化。在这个例子中,我只需要它告诉我从昨天到今天的变化:设备B关闭。然后,我将每天运行该脚本,向我的团队发送电子邮件。脚本还应该让我知道设备从昨天到今天是否通电 数据在SQL中,在PowerShell中,我已将数据从SQL

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

我需要一个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'})
还尝试了在没有CSV的情况下使用SQL数据

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


谢谢

老实说,我会用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,但它是今天没有的。

请阅读。您已经编写了一些代码了吗?如果是,请将其添加到您的初始帖子中。如果没有,这里提示您如何解决您的任务:/Compare Object-ReferenceObject$Table1 | Select Object-Property'Device Name',PowerState'-DifferenceObject$Table2 | Select Object-Property'Device Name',PowerState'@Patrick我刚刚添加了我正在使用的代码,包括您给我的新Compare Object。然而,这不会产生任何结果。我不确定我遗漏了什么。您能检查导入csv是否成功,因此变量$a和$b不是空的吗?您可以上传$a[0]和$b[0]输出的图片吗?我已经添加了数组a和b中第一个对象的图片。单击文章底部的链接。我已经验证了数组不是空的。我已经验证了CSV不是空的。这是一个更好的方法!我测试了这个,效果很好!您的代码只有一个问题,即您今天编写的第一行。PowerState as is is from this errors。但是,按原样删除效果非常好!哎呀!我本来打算昨天照旧,今天照旧,但写了一半才意识到这很愚蠢。非常感谢。