我有一个脚本,可捕获系统服务和卷的状态。它捕获服务的快照并将其本地保存到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
答案 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 。