-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathconvertto_stringdata_example.ps1
100 lines (89 loc) · 2.11 KB
/
convertto_stringdata_example.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# origin: https://stackoverflow.com/questions/68180889/convert-json-data-to-property-format-using-powershell
# https://gist.github.com/1RedOne/ebd7147f377738694446064a7768deef
# (does not work, and somwhow, no surprise)
function convertTo-StringData {
param (
$object, $propertyOverride
)
$fields = $object | get-member -MemberType NoteProperty
foreach($field in $fields){
if (IsArray($field)){
OutputArrayMember -object $object -field $field
}
else{
OutputMember -object $object -propertyName $field.name -propertyOverride $propertyOverride
}
}
}
function IsArray {
param ($object)
$object.Definition -match '.*\[\].*'
}
function OutputMember{
param(
$object,
$propertyName,
$propertyOverride
)
if ($propertyOverride){
"$($propertyOverride).$($propertyName)=$($object.$($propertyName))"
}
else{
"$($propertyName)=$($object.$($propertyName))"
}
}
function OutputArrayMember{
param(
$object,
$field
)
$global:testObject = $object
$global:testfield = $field
$base = $field.Name
$i = 0
foreach ($item in $object.$($field.Name)){
ConvertTo-StringData -object $object.$($field.Name)[$i] -propertyOverride "$base[$i]"
$i++
}
}
function Drill{
param(
$object,
$parentPath
)
if ($null -ne $parentPath){
$parentPath = $parentPath+$function:parentPath
$parentPath = $parentPath.TrimStart('.')
}
$parentPath
#select next leaf
if (hasChildren $object){
"drilling down into $object"
$props = GetNoteProperties $object
$var = getObjectByProperty $object $props
drill $var -parentPath "$($parentPath).$($props.Name)"
}
else{
ConvertTo-StringData -object $object -propertyOverride $parentPath
$global:test = $object
}
}
function hasChildren{
param(
$object
)
[bool](($object | gm -MemberType NoteProperty).Definition -match 'System.Management.Automation.PSCustomObject')
}
function GetNoteProperties{
param(
$object
)
get-member -InputObject $object -MemberType NoteProperty
}
function getObjectByProperty{
param(
$object,
$propertyName
)
$object.$($propertyName.Name)
}