如何将一个对象添加到另一个对象的值

时间:2019-01-05 09:59:55

标签: powershell object

我有一个脚本,可捕获系统服务和卷的状态。它捕获服务的快照并将其本地保存到JSON文件,在下次运行时它将获取所有服务状态,加载JSON并比较两个对象之间的差异。然后将这些差异保存到对象并发送到API。

我要做的所有工作(并且失败的地方很大)是将$Changes添加到$Data.state_changes.$Target,以便将服务更改添加到$Data.state_changes.services,将音量更改添加到{{1} }。

$Data.state_changes.volumes的示例是:

$Changes

所以我要弄清楚的是,将对象(都与上面的Name : AppXSvc Status : OK ExitCode : 0 ErrorControl : Normal PathName : C:\WINDOWS\system32\svchost.exe -k wsappx -p StartMode : Manual DelayedAutoStart : False DisplayName : AppX Deployment Service (AppXSVC) InstallDate : ServiceSpecificExitCode : 0 Started : True StartName : LocalSystem State : Running SideIndicator : previous_state Name : AppXSvc Status : OK ExitCode : 0 ErrorControl : Normal PathName : C:\WINDOWS\system32\svchost.exe -k wsappx -p StartMode : Manual DelayedAutoStart : False DisplayName : AppX Deployment Service (AppXSVC) InstallDate : ServiceSpecificExitCode : 0 Started : False StartName : LocalSystem State : Stopped SideIndicator : current_state 相似)添加到PSObject的最佳方法是什么?我确定这并不难,但是我不知道为什么我无法使它正常工作。

我本来以为它很简单:

$changes

Add-Member -InputObject $Data."state_changes" -NotePropertyName $Target -NotePropertyValue $Changes

1 个答案:

答案 0 :(得分:0)

对于这些任务,我真的建议您使用hashtable作为缓冲区对象。您可以在需要时使用属性(添加/更新/删除)填充它。以及使其嵌套对象。完成后,您可以使用hastable作为属性列表来制作PSObject,然后将其转换为JSON。

像这样:

$HashTable = @{}
$HashTable['state_changes'] = @{}
$HashTable['state_changes']['One'] = 1
$HashTable['state_changes']['Two'] = 2
if ($MyServiceState -eq 'Ready'){$HashTable.Add('MyServiceState','Ready')}
if ($MySrvSize -gt 90){$HashTable.Add('FreeSpaceCheck','Warning')}
if ($UpTime -lt 10){$HashTable.Add('UpTimeCheck',$UpTime)}
$HashTable['FreeSpaceCheck'] = 'OK'
$PSObject = New-Object PSObject -Property $HashTable

我希望你明白这一点!

此外,您的代码中似乎还有一个错字:

Add-Member -MemberType NoteProperty -InputObject $Data."state_changes".$Target -NotePropertyName $i -NotePropertyValue $Change -force

您尝试致电 $ Change ,而不是 $ Changes