PowerShell修改ConvertFrom-Json生成对象属性提示不存在但实际存在问题咨询
问题根源
1. 数组索引缺失
JSON定义中accessPackageAssignmentPolicies是数组类型(被[]包裹),内部仅包含1个初始策略对象,你在访问其子属性时未加索引[0],直接操作数组对象本身的属性,无法找到对应定义。
补充:
allowedRequestors可正常修改是因为PowerShell访问数组属性时会自动展开所有元素的属性,刚好命中了第一个策略对象下已初始化的allowedRequestors空数组,所以追加操作可执行,但其他赋值、嵌套属性操作场景下该自动展开机制不生效。
2. null属性赋值逻辑错误
初始JSON中requestApprovalSettings默认值为null,你使用+=运算符追加对象是错误的:+=仅适用于已存在的数组/集合追加元素,针对null属性应直接用=赋值新对象。
3. 对象属性访问语法错误
Get-Variable仅用于读取独立PowerShell变量,approver$i是$assignmentData对象的属性,不需要用Get-Variable读取,直接用动态属性访问语法即可。
4. 嵌套数组未加索引
approvalStages是你新定义的数组,访问primaryApprovers时未指定要修改数组中哪个元素的属性,直接操作数组整体属性导致报错。
修复后代码(仅修改foreach循环内错误部分)
foreach($assignmentData in $Content) { $accesspacakgeRequestObject.catalogId = $assignmentData.catalogId $accesspacakgeRequestObject.displayName = $assignmentData.displayName $accesspacakgeRequestObject.description = $assignmentData.description # 加[0]指定访问第一个策略对象 $accesspacakgeRequestObject.accessPackageAssignmentPolicies[0].requestorSettings.scopeType = $assignmentData.scope if ($assignmentData.scope -eq "SpecificDirectorySubjects") { # 加[0]指定访问第一个策略对象 $accesspacakgeRequestObject.accessPackageAssignmentPolicies[0].requestorSettings.allowedRequestors += New-Object -TypeName psobject -Property @{'@odata.type' = '#microsoft.graph.groupMembers'; 'id' = $assignmentData.groupId; 'description' = $assignmentData.groupName; 'isBackup' = 'false'} } $numApprovalStages = [int]$assignmentData.approvalStages if ($numApprovalStages -gt 0) { # 加[0]指定访问第一个策略对象,将+=改为=直接赋值给null属性 $accesspacakgeRequestObject.accessPackageAssignmentPolicies[0].requestApprovalSettings = New-Object -TypeName psobject -Property @{'approvalMode' = 'Serial'; 'isApprovalRequired' = 'true'; 'isApprovalRequiredForExtension' = 'false'; 'isRequestorJustificationRequired' = 'false'; 'approvalStages' = @()} for ($i=1;$i -le $numApprovalStages; $i++) { # 加[0]指定访问第一个策略对象 $accesspacakgeRequestObject.accessPackageAssignmentPolicies[0].requestApprovalSettings.approvalStages += New-Object -TypeName psobject -Property @{'approvalStageTimeOutInDays' = '14'; 'primaryApprovers' = @(); escalationApprovers = @();'isEscalationEnabled' = 'false'; 'escalationTimeInMinutes' = '0'; 'isApproverJustificationRequired' = 'true'} # 加[$i-1]指定访问刚添加的审批阶段对象,修改动态属性访问语法 $accesspacakgeRequestObject.accessPackageAssignmentPolicies[0].requestApprovalSettings.approvalStages[$i-1].primaryApprovers += New-Object -TypeName psobject -Property @{'@odata.type' = '#microsoft.graph.singleUser'; "displayName" = ''; 'objectId' = $assignmentData."approver$i"; 'isBackup' = 'false'} } } $requestbody = $accesspacakgeRequestObject | ConvertTo-Json -Depth 10 $response = Invoke-RestMethod $emlRequestUrl -Headers $headers -Method Post -Body $requestbody -UseBasicParsing -ErrorAction Continue }
内容的提问来源于stack exchange,提问作者Berty.
相关产品推荐
相关产品推荐

