Powershell结果分组在不应该分组的位置

时间:2019-08-20 21:16:46

标签: powershell

我有一个读取json并返回结果集的过程。如果工作表中有错误,我希望它们与工作表名称一起返回。

我的代码有效,但最终将所有工作表名称分组在一起,给我不一致的结果

    $jsonFilePath = '{
    "stores": [
        {
            "storename": "Target",
            "files": [
                {
                    "sheets": [
                        {
                            "name": "INVENTORY",
                            "errors": [
                                "Multiple header rows found on sheet: INVENTORY", "Invalid data in field name: STARBUCKS"
                            ],
                            "locations": []
                        },
                        {
                            "name": "SITE ADD",
                            "locations": []
                        }
                    ],
                    "name": "TARGET INVENTORY.xlsx",
                    "fileId": "ff2087de-52eb-4d5a-be16-3dfa53598766",
                    "status": "failed"
                }
            ]
        }
    ]
}'



$json = $jsonFilePath | ConvertFrom-Json 

<#$error_result = #>
$json.stores | foreach-Object {
    foreach ($File in $_.files)
    {
        [PSCustomObject]@{
            storename = $_.storename
            SheetErrors = ($File.sheets.errors -join ' | ')
            SheetName = $File.sheets.name
            fileId = $File.fileId} | Where-Object {$File.sheets.errors -ne $null}
    }
  } 

哪个返回此结果。 SITE ADD工作表名称不应显示,因为该工作表上没有错误:

storename SheetErrors                                                                               SheetName             fileId                              
--------- -----------                                                                               ---------             ------                              
Target    Multiple header rows found on sheet: INVENTORY | Invalid data in field name: STARBUCKS |  {INVENTORY, SITE ADD} ff2087de-52eb-4d5a-be16-3dfa53598766

这就是我要寻找的:

storename SheetErrors                                                                               SheetName             fileId                              
--------- -----------                                                                               ---------             ------                              
Target    Multiple header rows found on sheet: INVENTORY | Invalid data in field name: STARBUCKS |  INVENTORY             ff2087de-52eb-4d5a-be16-3dfa53598766

我只想返回任何有错误的工作表名称。我想让这项工作失去什么?

1 个答案:

答案 0 :(得分:1)

问题是$File.sheets.name 无条件枚举了所有工作表名称,而您只希望有错误的工作表名称。

因此,替换:

SheetName = $File.sheets.name

具有:

SheetName = ($File.sheets | Where-Object errors).Name

请注意,使用隐式到布尔型转换来检测(非空).errors属性的存在。


在代码的上下文中,应用了另一项优化,以避免两次访问$File.sheets.errors

$json.stores | Foreach-Object {
  foreach ($File in $_.files) {
    if ($errs = $File.sheets.errors) {
      [PSCustomObject]@{
        storename   = $_.storename
        SheetErrors = $errs -join ' | '
        SheetName   = ($File.sheets | Where-Object errors).Name
        fileId      = $File.fileId
      }
    }
  }
}